这个问题在《SO》中被问了很多次。但我还是拿不到东西。
我想从回调中得到一些值。请查看下面的脚本以获得澄清。
function foo(address){
// google map stuff
geocoder.geocode( { 'address': address}, function(results, status) {
results[0].geometry.location; // I want to return this value
})
}
foo(); //result should be results[0].geometry.location; value
如果我试图返回那个值,就会得到"undefined"我遵循了《SO》的一些想法,但是
仍然失败。
这些都是:
function foo(address){
var returnvalue;
geocoder.geocode( { 'address': address}, function(results, status) {
returnvalue = results[0].geometry.location;
})
return returnvalue;
}
foo(); //still undefined
这是不可能的,因为您无法从同步方法内部的异步调用中返回。
在这种情况下,您需要传递一个回调给foo,它将接收返回值
function foo(address, fn){
geocoder.geocode( { 'address': address}, function(results, status) {
fn(results[0].geometry.location);
});
}
foo("address", function(location){
alert(location); // this is where you get the return value
});
问题是,如果内部函数调用是异步的,那么为了“返回”响应,所有“包装”该调用的函数也必须是异步的。
如果你有很多回调,你可以考虑冒险一下,使用像Q这样的承诺库。
这是不可能的,因为您无法从同步方法内部的异步调用中返回。
在这种情况下,您需要传递一个回调给foo,它将接收返回值
function foo(address, fn){
geocoder.geocode( { 'address': address}, function(results, status) {
fn(results[0].geometry.location);
});
}
foo("address", function(location){
alert(location); // this is where you get the return value
});
问题是,如果内部函数调用是异步的,那么为了“返回”响应,所有“包装”该调用的函数也必须是异步的。
如果你有很多回调,你可以考虑冒险一下,使用像Q这样的承诺库。