执行所有异步函数后执行函数

时间:2014-09-11 10:21:28

标签: javascript angularjs asynchronous

如何执行三个异步函数后执行函数?我的解决方法是全球反击。

我的问题详细: 调用save函数时,会进行3次异步webapi调用以将更改的数据发送到服务器。之后,我需要调用一个打印和记录的函数,例如save命令是成功的。

这是我目前的解决方法。但似乎并不是很好。有时计数器值不正确。

function save () {
  callwebapi1(parameters, function (dataOnSuccess) { counter = counter - 1; canMethodBeExecuted(); });
  callwebapi2(parameters, function (dataOnSuccess) { counter = counter - 1; canMethodBeExecuted(); });
  callwebapi3(parameters, function (dataOnSuccess) { counter = counter - 1; canMethodBeExecuted(); });
}

function canMethodBeExecuted () {
  if (counter < 0) {
    counter = 3;
    functionToExecuteAfterSaveIsFinished();
  }
}

有没有像上面那样更好的解决方案?

3 个答案:

答案 0 :(得分:0)

是的,您可以在AngularJS中使用promises / deferred:

    var promises = [];
    promises.push($http.get('/webAPI1'));
    promises.push($http.get('/webAPI2'));
    promises.push($http.get('/webAPI3'));
    $q.all(promises)
      .then(function (results)
       {
           for (var k = 0; k < results.length; k++) {
                 // iterate through results and do what you want 
           }
       });

阅读the doc了解详情。

答案 1 :(得分:0)

使用角度承诺库$ q。它将确保在执行下一步之前完成所需的操作。

var save = function () {
  var deferred = $q.defer(),
      counter = 3,
      callback = function () {
        counter --;
        if (counter < 0) deferred.resolve();
  };

  callwebapi1(parameters, callback);
  callwebapi2(parameters, callback);
  callwebapi3(parameters, callback);
  return deferred.promise;
}

save().then(function(){
  //code to run after your calls are complete
});

答案 2 :(得分:0)

您也可以使用async (see here),在您的情况下使用parallel方法:

function asynchronousMethod1 (callback) {
  // ... API call, whatever... then :
  callback(null, 'data1');
}

function asynchronousMethod2 (callback) {
  callback(null, 'data2');
}

function asynchronousMethod3 (callback) {
  callback(null, 'data3');
}

async.parallel([
  asynchronousMethod1,
  asynchronousMethod2,
  asynchronousMethod3
], function (err, results) {
  // results === ['data1', 'data2', 'data3']
});