同步调用异步函数

时间:2012-07-20 19:24:38

标签: javascript jquery ajax

让我说我有这个async functuin:

function fooAsync(){
  callSomeApi(some_args, callbackFunction(results){
    return results; //i want to return the results here after the api call.
  }
}

我正在寻找一种方法将prev函数的返回值赋值给var,并且只有当我有这个值时才继续使用代码。

//some code here
var foo = fooAsync();
//some code here after getting back from the async function.

问题是foo将是未定义的,因为javascript将在内部异步api调用完成之前返回。我知道我可以使用回调,但我正在寻找一种“锁定”异步函数的方法,并且只有在得到结果时才恢复。这样我就不必在异步调用之后传递所有代码作为回调。

简化事项 - 如何以常规同步方式从异步ajax调用(在我的情况下称为google maps api)返回值?

1 个答案:

答案 0 :(得分:4)

通常,使ajax调用同步是一个坏主意。您可以设置XMLHttpRequest对象上的属性(jQuery允许您轻松地执行此操作)以生成同步ajax请求。我不确定谷歌地图API是否公开了此功能,但你应该先检查一下。

我知道你说你不想使用回调但是除了做这样的事情之外:

while(foo === undefined){
  sleep(5) //pseudo code sleep method
}

确实无法锁定当前的执行上下文。

同样使用您提供的代码,该方法永远不会返回除undefined之外的任何内容。您正在调用api方法(异步执行)并立即返回控制。 api方法调用的响应处理程序内的'return'语句只会返回匿名函数内部。所以即使你 能够锁定线程直到结果回来,你也不会拥有它们。

但是,如果您有兴趣以正确的方式进行此操作,那么您应该使用jQuery提供的延迟/保证模型。

function fooAsync(){
  var deferred = $.Deferred();
  callSomeApi(some_args, callbackFunction(results){
    deferred.resolve(results) //i want to return the results here after the api call.
  }
  return deferred.promise();
}

然后你会将你的调用代码更改为:

//some code here
$.when(fooAsync()).then(function(results){
    //use the results
});
//some code here after getting back from the async function.

jQuery Deferred Object Documentation

相关问题