如何执行三个异步函数后执行函数?我的解决方法是全球反击。
我的问题详细: 调用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();
}
}
有没有像上面那样更好的解决方案?
答案 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']
});