2014-09-11 4 views
0

세 개의 비동기 함수가 실행 된 후 함수를 실행하려면 어떻게해야합니까? 이에 대한 해결 방법은 글로벌 카운터입니다.모든 비동기 함수가 실행 된 후에 함수가 실행됩니다.

내 문제 세부 사항 : 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와 이연

+0

'$의 q.all'이 솔루션입니다. 문서를 참조하십시오. – Chandermani

답변

0

예를 사용할 수있는 약속은/:

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

또한 경우에 parallel 방법을 async(see here)을 사용할 수 있습니다

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'] 
}); 
관련 문제