jQuery JavaScript嵌套异步函数回调

Гро*_*ный 2 javascript jquery asynchronous jquery-callback

我有点困惑如何确定从另一个调用多次异步函数何时完成上一次迭代的调用:

function MainAsyncFunction(callback) {
  for (var i = 0; i < 10; i++) {
    SubAsyncFunction(function(success) {
      if (i >= 10 && success) { // THIS IS WRONG?!
        callback(true); // happens too early
      }
    });
  }
};

function SubAsyncFunction(callback) {
  SubSubAsyncFunction(function() {
        callback(true);
  });
}
Run Code Online (Sandbox Code Playgroud)

我正在做的是调用Google Distance Matrix服务,该服务有25个目的地的限制,因此我不得不拆分我的目的地数组以多次调用此服务,但我不明白它何时完成.

在代码的主要部分,我可以看出MainAsyncFunction中的循环的第二次迭代在进行回调时尚未完成.

我认为我的问题是在处理JavaScript中的异步函数时我没有理解事件的顺序......请解释一下如何正常实现主题.

Ste*_*rex 7

您可以使用jQuery Deferred对象,该对象充当表示异步操作状态的标记.

以下是一个简化示例:

//set up your sub method so that it returns a Deferred object
function doSomethingAsync() {
    var token = $.Deferred();
    myAsyncMethodThatTakesACallback(function() {
        //resolve the token once the async operation is complete
        token.resolve();
    });
    return token.promise();
};

//then keep a record of the tokens from the main function
function doSomethingAfterAllSubTasks() {
    var tokens = [];
    for (var i=0; i < 100; i++) {
        //store all the returned tokens
        tokens.push(doSomethingAsync());
    }

    $.when.apply($,tokens)
        .then(function() {
            //once ALL the sub operations are completed, this callback will be invoked
            alert("all async calls completed");
        });
};
Run Code Online (Sandbox Code Playgroud)

以下是OP更新代码的更新版本:

function MainAsyncFunction(callback) {
  var subFunctionTokens = [];
  for (var i = 0; i < 10; i++) {
    subFunctionTokens.push(SubAsyncFunction());
  }

  $.when.apply($,subFunctionTokens)
  .then(function() {
    callback(true);
  });
};

function SubAsyncFunction() {
  var token = $.Deferred();
  SubSubAsyncFunction(function() {
        token.resolve();
  });
  return token.promise();
};?
Run Code Online (Sandbox Code Playgroud)