Javascript函数的返回值

3

我卡在一个可能很简单的问题上了。

我可以使用console.log从codeAddress函数返回一个值,但是我无法让它返回到调用它的另一个函数。 两个相关代码行已用注释标出。

请不要在意我可怕的XX拼接; 我只是想弄清楚函数调用。

任何帮助都将不胜感激。谢谢!

function codeAddress(zipCode) {
    geocoder.geocode( { 'address': zipCode}, function(results, status) {
       var lat = results[0].geometry.location.d;
       var lng = results[0].geometry.location.e;
       var latlng = lat+'XX'+lng;
       return latlng;    // I can console log this value
     });
  }

var citymap = {};
function loadMap() {
  $.ajax({                                      
        url: 'getdata.php',
        data: "query=geolocate",
        dataType: 'json',
        success: function (zips) {
            for (var i in zips)
            {
                var entry = zips[i];
                citymap[entry['zip_code']]= {
                    scans: entry['num_scans'],
                    position: codeAddress(entry['zip_code'])  // But it will never return down here
                };
            } 
        } 
});
}

2
回调函数不返回。在回调函数本身中完成你的工作。 - dandavis
1
欢迎来到异步编程的奇妙世界!你做不到那个。 - SLaks
3个回答

1
对于异步函数,您需要提供回调函数,而不是期望返回值。您应该像这样调用“codeAddress”函数:
var entry = zips[i];
var citymapForZip = {
    scans: entry['num_scans'],
};
var zipCode = entry['zip_code'];
citymap[zipCode] = citymapForZip;
codeAddress(zipCode, getCallbackFunction(citymapForZip));

我使用了一个辅助函数"getCallbackFunction",它应该为给定的城市地图生成回调函数。回调函数将简单地接收地理编码结果,并设置城市地图的"position"属性。就像这样:
function getCallbackFunction(citymap) {
    return function(result) {
        citymap.position: result; 
    };
}

最后,您的codeAddress函数应该将“latlng”传递给回调函数,而不是返回它:
function codeAddress(zipCode, callback) {
    geocoder.geocode( { 'address': zipCode}, function(results, status) {
       var lat = results[0].geometry.location.d;
       var lng = results[0].geometry.location.e;
       var latlng = lat+'XX'+lng;
       callback(latlng);
     });
  }

0

这与作用域有关。

geocoder.geocode( { 'address': zipCode}, function(results, status) {
       var lat = results[0].geometry.location.d;
       var lng = results[0].geometry.location.e;
       var latlng = lat+'XX'+lng;
       return latlng;    // I can console log this value
     });

返回到codeAddress的作用域,但codeAddress不会返回到调用者的作用域。


0

由于调用 geocode 函数是异步的,因此您必须使用回调函数来使用其结果:

function codeAddress(zipCode,cb) {
    geocoder.geocode( { 'address': zipCode}, function(results, status) {
       //maybe you want to check status for error condition here
       var lat = results[0].geometry.location.d;
       var lng = results[0].geometry.location.e;
       var latlng = lat+'XX'+lng;

       cb(zipCode, latLng);
    });
}

var citymap = {};
function loadMap(cb) {
  $.ajax({                                      
        url: 'getdata.php',
        data: "query=geolocate",
        dataType: 'json',
        success: function (zips) {
            var i = 0,
                l = remaining = zips.length;

            for (; i <l; i++)    //better way to loop an array
            {
                var entry = zips[i];

                codeAddress(entry['zip_code'], function (zipCode,results){
                    citymap[zipCode] = {
                         scans: entry['num_scans'],
                         position: results;  
                    };

                    if (--remaining) {
                       cb();
                    } 
                });


            } 
        } 
  });
}

//call also loadMap with a callback to know when all zip are resolved
loadMap(function() {
    console.dir(citymap);    //all done!
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接