2011-09-13 5 views
3

많은 비동기 작업이 완료된 후 함수를 호출하는 표준 방법이 있습니까? 나는 N 개의 파일을 반복하고 비동기 함수를 호출한다. 루프 이후 나는 done()을 호출했는데, 그 이유는 작업이 여전히 비동기 호출로 인해 끝났기 때문에 작업이 완료 되었기 때문에 버그가 발생하기 전까지 발생했습니다.루프가 완료되면 JS에서 함수를 호출 하시겠습니까?

어쨌든 내 자신의 카운트 다운 코드를 쓰는 대신에 표준적인 방법으로 이러한 모든 함수/비동기 호출이 끝난 후에이 코드를 호출한다고 말할 수 있습니까?

답변

3

콜백 함수가

  1. 가 카운터를 증가 그들 각각 전달 (처음에 0으로 설정) 이미 처리 사물의 수

    이 그런 다음 assync 작업을 호출을 잡고 카운터 만들기

  2. 할 일의 수는 카운터가 안전하게 기본적인 아이디어는 done()

전화, N에 도달하면이 있지만, 오류 처리를 위해 몇 가지 추가 항목을 추가해야 할 수도 있습니다.


당신이 운 좋은 정도로 비동기 라이브러리를 사용하려면이 작업을 수행 할 수있는 기능이 필요할 수 있습니다. 예를 들어, Dojo는 이러한 유형의 동기화를 위해 dojo.DeferredList를가집니다.

0

나는 이런 종류의 사용하는 경향이 :

function TaskList(tasks, endOfTasksCallback) { 
    this.doTasks = function() { 
     var numTasks = tasks.length; 
     function singleTaskCallback() { 
      if (--numTasks == 0) { 
       endOfTasksCallback(); 
      } 
     } 
     for (var i = 0; i < tasks.length; i++) { 
      tasks[i](singleTaskCallback); 
     } 
    } 
} 

function createTask(taskIdx) { 
    // a task is a function that does some work 
    // for this demo it's simply a random wait 
    return function (endOfTaskCallback) { 
     var ms = Math.floor(Math.random() * 1000 * 5); 
     var startTime = new Date().getTime(); 
     setTimeout(function() { 
      var endTime = new Date().getTime(); 
      console.log("task " + taskIdx + " completed in " + (endTime-startTime) + "ms."); 
      endOfTaskCallback(); 
     }, ms); 
    } 
} 

var numTasks = 10; 
var tasks = []; 
for (var i = 0; i < numTasks; i++) { 
    tasks.push(createTask(i)); 
} 
new TaskList(tasks, function() { 
    console.log("all done!"); 
}).doTasks(); 

을하고이 같은 출력을 얻을 :

task 3 completed in 215ms. 
task 5 completed in 1365ms. 
task 2 completed in 2020ms. 
task 4 completed in 2360ms. 
task 0 completed in 2595ms. 
task 6 completed in 2940ms. 
task 9 completed in 3220ms. 
task 1 completed in 3515ms. 
task 8 completed in 3560ms. 
task 7 completed in 4845ms. 
all done! 
관련 문제