Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在执行所有异步函数后执行函数_Javascript_Angularjs_Asynchronous - Fatal编程技术网

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

Javascript 在执行所有异步函数后执行函数,javascript,angularjs,asynchronous,Javascript,Angularjs,Asynchronous,在执行三个异步函数之后,如何实现执行一个函数?我的解决方法是使用全局计数器 我的具体问题是: 调用save函数时,将进行3次异步webapi调用,以将更改的数据发送到服务器。之后,我需要调用一个函数来打印和记录save命令是否成功 这是我目前的解决办法。但这似乎不是很好。有时计数器的值不正确 function save () { callwebapi1(parameters, function (dataOnSuccess) { counter = counter - 1; canMetho

在执行三个异步函数之后,如何实现执行一个函数?我的解决方法是使用全局计数器

我的具体问题是: 调用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();
  }
}

有更好的解决方案吗?

是的,您可以在AngularJS中使用承诺/延迟:

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

阅读了解更多信息。

使用angular promise库$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
});
您也可以使用async,在您的案例中是并行方法:

$q。一切都是解决方案。见文件。
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']
});