2014-09-11 112 views
0

如何在執行三個異步函數後實現一個函數?我的解決方法是全球計數器。執行所有異步函數後執行函數

我的問題詳細: 當保存功能被調用時,3個異步webapi調用將發送更改的數據到服務器。之後,我需要調用一個打印和記錄的函數,例如保存命令是成功的。

這是我目前的解決方法。但它似乎不是很好。有時計數器值不正確。

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

'$ q.all'是解決方案。請參閱文檔。 – Chandermani 2014-09-11 10:31:07

回答

0

是的,你可以使用承諾/在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 
      } 
     }); 

更多信息閱讀the doc

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