之前可能会问,但经过认真的搜索后,我仍然无法找到合适的解决方案。请考虑这样的事情:
function compute() {
asyncCall(args, function(err, result) {
});
/* 'join thread here' */
}
即使asyncCall
是异步的,我也想使用result
并同步从函数compute
返回它。 asyncCall
是一个库调用,我无法以任何方式修改它。
如何正确等待异步结果没有setTimeout
并观察条件变量?这是可能的但不是最理想的。
答案 0 :(得分:3)
不确定如何真正使用尚不存在的东西,但很容易返回结果所在的位置:
function compute() {
var rez=[];
asyncCall(args, function(err, result) {
rez[0]=result;
if(rez.onchange){ rez.onchange(result); }
});
/* 'join thread here' */
return rez;
}
现在,你可以参考return的[0]属性,一旦回调进来,compute()[0]就会得到结果。它还将触发一个事件处理程序,您可以将其附加到返回的数组,当数据在回调内部更新时将触发该数组。
我会使用更正式的东西,如承诺或次要回调,但那就是我......
编辑:如何在上游集成回调:
// sync (old and busted):
function render(){
var myView=compute();
mainDiv.innerHTML=myView;
}
//async using my re-modified compute():
function render(){
var that=compute();
that.onchange=function(e){ mainDiv.innerHTML=e; }
}
看看如何让它等待只在渲染函数中添加一个包装器?
答案 1 :(得分:1)
广泛使用的浏览器中没有await
语法。您的选项通常仅限于回调模式或承诺。
NodeJS遵循大多数异步方法的回调模式。
function someAsyncMethod(options, callback) {
//callback = function(error, data)
// when there is an error, it is the first parameter, otherwise use null
doSomethingAsync(function(){
callback(null, response);
});
}
....
someAsyncMethod({...}, function(err, data) {
if (err) return alert("OMG! FAilZ!");
// use data
});
另一种常见的实现是承诺,例如jQuery's .ajax()方法......
var px = $.ajax({...});
px.data(function(data, xhr, status){
//runs when data returns.
});
px.fail(function(err,xhr, status){
//runs when an error occurs
});
承诺与事件类似......
在上面的两种方法中,回调语法往往更容易实现和遵循,但可以导致深度嵌套的回调树,尽管你可以使用实用程序模式,像async这样的方法来克服这个问题。