如何从asynchronouscallback函数返回值?

这个问题在SO中被多次提出。 但是我仍然无法得到东西。

我想从callback中获得一些价值。 看看下面的脚本澄清。

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 

如果我尝试返回该值只是“未定义”。 我跟从了一些想法,但仍然失败。

那些是:

 function foo(address){ var returnvalue; geocoder.geocode( { 'address': address}, function(results, status) { returnvalue = results[0].geometry.location; }) return returnvalue; } foo(); //still undefined 

这是不可能的,因为你不能从同步方法中的asynchronous调用返回。

在这种情况下,您需要将callback传递给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 }); 

事情是,如果一个内部函数调用是asynchronous的,那么所有的函数“包装”这个调用也必须是asynchronous的,以便“返回”一个响应。

如果你有很多的callback,你可能会考虑冒险,并使用像Q这样的承诺库 。

从callback中返回值是没有意义的。 相反,做你想你的callback里面做的“foo()”工作。

当事件发生时,asynchronouscallback被浏览器或像Google地理编码库这样的框架调用。 没有地方可以返回值。 callback函数可以返回一个值,换句话说,调用该函数的代码将不会注意返回值。

如果你碰巧使用jQuery,你可能想要这样一个镜头: http : //api.jquery.com/category/deferred-object/

它允许你推迟你的callback函数的执行,直到ajax请求(或任何asynchronous操作)完成。 一旦几个Ajax请求全部完成,这也可以用来调用callback。