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