Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从异步回调函数返回值?_Javascript_Asynchronous_Callback_Javascript Objects - Fatal编程技术网

Javascript 如何从异步回调函数返回值?

Javascript 如何从异步回调函数返回值?,javascript,asynchronous,callback,javascript-objects,Javascript,Asynchronous,Callback,Javascript Objects,这个问题在SO中被问了很多次。但我还是拿不到东西 我想从回调中得到一些值。请看下面的脚本以获得澄清 function foo(address){ // google map stuff geocoder.geocode( { 'address': address}, function(results, status) { results[0].geometry.location; // I want to return this value

这个问题在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
如果我试图返回未定义的值。我遵循了SO的一些想法,但是 仍然失败

这些是:

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

从回调返回值是没有意义的。相反,在回调函数中执行希望执行的foo工作


事件发生时,浏览器或某些框架(如谷歌地理编码库)会调用异步回调。返回的值无处可去。换句话说,回调函数可以返回值,但调用该函数的代码不会注意返回值。

这是不可能的,因为无法从同步方法内的异步调用返回

在这种情况下,您需要将回调传递给将接收返回值的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
});
问题是,如果内部函数调用是异步的,那么“包装”此调用的所有函数也必须是异步的,以便“返回”响应


如果你有很多回调,你可以考虑跳转并使用.

如果你碰巧在使用jQuery,你可能想给出一个例子:


它允许您推迟回调函数的执行,直到ajax请求或任何异步操作完成。这也可以用于在几个ajax请求全部完成后调用回调。

:这不是很强,只是它的特性。一旦您使用异步方法传递数据,整个函数链就会变为异步。投票表决最终使其有意义。您不能在同步方法内使用异步调用。-是的,你可以。您不能在同一个同步方法中使用异步调用的结果。@Sean Kinsey,您能告诉我如何在foo函数之外访问位置变量吗?我们很清楚,这不会让您以PHP返回该变量的方式返回该变量的值。我们基本上是将一个回调函数的结果传递给另一个回调函数。仍然没有任何外部变量能够真正保存结果…任何人都可以。它解释了如何有效地解决这个问题。还提供了对当前问题的更一般、更详细的解释。请使用Q或它的任何变体,如angularJs附带的$Q库。永远不要回头。异步函数立即返回未定义的。所以,千万不要浪费时间去做一些未定义的事情。也不要像通常那样在异步函数中使用“return”关键字。改用延期承诺。deferred.resolve您想做的事情,然后稍后您可以简单地返回“return deferred.promise;”: