对async函数进行同步调用
making synchronous call to async function
假设我有这个异步函数:
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将在内部asyncapi调用完成之前返回。我知道我可以使用回调,但我正在寻找一种方法来"锁定"异步函数,只有当它得到结果时才能恢复。这样,我就不必在异步调用后将所有代码作为回调传递。
简而言之,如何以常规同步方式从异步ajax调用(在本例中,我调用googlemapsapi)返回值?
通常,让ajax调用同步是个坏主意。XMLHttpRequest对象上有一个属性,您可以设置它(jQuery允许您轻松地执行此操作)来发出同步ajax请求。我不确定谷歌地图API是否公开了这个功能,但你应该先检查一下。
我知道你说过你不想处理回调,但除了做这样的事情:
while(foo === undefined){
sleep(5) //pseudo code sleep method
}
确实没有任何方法可以锁定当前的执行上下文。
同样,使用您提供的代码,该方法将永远不会返回除未定义之外的任何内容。您正在调用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延迟对象文档
相关文章:
- 同步调用,直到用户通过angular验证为访问者
- 如何使用javascript中的生成器模拟同步调用
- 通过同步调用检查用户是否存在
- Node.js同步调用passport本地注册
- 在同步调用之前先调用函数
- 对async函数进行同步调用
- 节点.js与 ASYC 瀑布模块同步调用
- 如何在节点/环回中同步调用 model.find 方法
- 异步进程上的同步调用
- 从 javascript 同步调用 Struts 2 操作
- 环回:对环回 API 进行同步调用
- JavaScript 同步调用
- Javascript方法同步调用,没有回调和$.ajax
- Javascript 同步调用与更新
- EXT-js如何同步调用Store
- AngularJs:$http同步调用
- phonecap对文件系统的同步调用
- javascript/nodejs:在大的、分块的数据集上同步调用一组类似的异步函数会导致内存泄漏
- Meteor同步调用函数
- 在nodejs中,是否有更好的设计模式来同步调用异步函数