可能之前问过,但经过认真搜索后我仍然找不到合适的解决方案。请考虑这样的事情:
function compute() {
asyncCall(args, function(err, result) {
});
/* 'join thread here' */
}
尽管asyncCall
是异步的,我想使用结果
并从函数compute
同步返回它。 asyncCall
是一个库调用,我无法以任何方式修改它。
如何在没有setTimeout
并观察条件变量的情况下正确等待异步结果?这是可能的,但不是最理想的。
最佳答案
不确定如何真正使用尚不存在的东西,但返回结果将是的槽很容易:
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]就会得到结果。它还将触发一个事件处理程序,您可以将其附加到返回的数组,当回调中的数据更新时,该事件处理程序将触发。
我会使用更正式的东西,比如 promise 或二次回调,但这就是我......
编辑:如何集成回调上游:
// 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; }
}
看看如何让它等待只在渲染函数中添加一个包装器?
关于javascript - 在 JavaScript 中加入线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993377/