2014-02-07 158 views
3

我陷入了可能非常简单的事情。返回值为JavaScript函数

我可以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

欢迎来到** async **的精彩世界!你不能那样做。 – SLaks

回答

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”,这应当能够给城市地图的回调函数。回调将简单地采用地理编码结果,并设置城市地图的“位置”属性。就像这样:

function getCallbackFunction(citymap) { 
    return function(result) { 
     citymap.position: result; 
    }; 
} 

最后,您codeAddress功能应,而不是返回“经纬度”,它传递给回调:

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! 
});