2

之前可能问过,但经过认真搜索后,我仍然无法找到合适的解决方案。请考虑这样的事情:

function compute() {
  asyncCall(args, function(err, result) {
  });
  /* 'join thread here' */
}

即使asyncCall是异步的,我也想使用result并从函数中compute同步返回它。asyncCall是一个库调用,我不能以任何方式修改它。

如何在不setTimeout观察条件变量的情况下正确等待异步结果?这是可能的,但不是最理想的。

4

2 回答 2

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; }
}

看看如何让它等待只在渲染函数中添加了一个包装器?

于 2013-06-07T21:42:59.907 回答
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
});

另一个常见的实现是 promises,比如jQuery 的 .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等方法来克服这一点。

于 2013-06-07T22:22:12.560 回答