如何保证异步返回值在函数返回之前保存

How to guarantee that asynchronous return values are saved before function returns?

本文关键字:返回 保存 函数 何保证 异步 返回值      更新时间:2023-09-26

根据我的理解,下面代码中的100个asyncFunctions将不会执行,直到func返回true之后,此时对I的引用将无效。我猜这段代码中没有任何东西会像预期的那样工作。

Psedo示例代码:

function func(){
  var needToKnow = []
  for i = 1 to 100 {
    needToKnow[i] = asyncFunction( i )
  }
  //Do some work on needToKnow[i]
  return true
}

Javascript怎么做呢?

使用回调:

function func(callback) {
    var needToKnow = [],
        max = 100;
    for (var i = 0; i < max; i++) {
        asyncFunction(i, function (result) {
            needToKnow.push(result);
            if (needToKnow.length == max) { // or something that let you know that its finished
                callback(needToKnow);
            }
        });
    }
}
function asyncFunction(i, callback) {
    setTimeout(function () {
        callback({ index: i });
    }, 1000); // Im an async func!
}

并这样使用:

func(function (result) {
    console.log(result);
});

小心,不要进入回调地狱

下面是一个使用Q Promise库的例子:

function functionThatCouldThrowError(i){
  //It doesn't, but just to give an idea of error propagation.
  return { index: i };
}
function asyncFunction(i) {
  var deferred = Q.defer();
    setTimeout(function () {
      try{
        var data = functionThatCouldThrowError(i);
        deferred.resolve(data);
      } catch (error) {
        deferred.reject({ index: i, error: error });
      }
    }, 1000);
    return deferred.promise;
}
function doAll() {
  var needToKnow = []
  for (var i = 0; i < 100; i++) {
    needToKnow[i] = asyncFunction( i );
  }
  return Q.all(needToKnow);
}
doAll().then(function(arg) {
  //arg contains all 100 elements
  alert("All done");
})

Update:扩展了该示例,以演示如何处理错误。砰砰作响:http://plnkr.co/edit/djWpTKxgvzK2HmkVwvTy?p =预览