2010-05-26 7 views
14

여러 비동기 메소드 (클라이언트 SQLite 데이터베이스)를 실행하고 최종 콜백 만 호출하면됩니다.javascript : 하나의 콜백으로 비동기 메소드를 실행하십시오.

은 물론, 추악한 방법은 다음과 같습니다

execAll : function(callBack) { 
     asynch1(function() { 
      asynch2(function() { 
       ... 
       asynchN(function() { 
        callBack(); 
       }) 
      }) 
     }); 
    } 

그러나 나는 그것을 할 수있는 더 나은 방법이 알고있다. 직관적으로 나는 모든 콜백이 최종 콜백을 호출하는 카운터와 함께 호출되었을 때를 감지 할 것입니다.

누군가가 올바른 방향으로 날 지점 수 있다면, 그래서이 공통 디자인 패턴 생각 ... 사전에

감사합니다!

답변

20

var callback = (function(){ 
    var finishedCalls = 0; 
    return function(){ 
     if (++finishedCalls == 4){ 
      //execute your action here 
     } 
    }; 
})(); 

그냥 모든 방법이 콜백을 통과하고,이 4 번 호출되고 나면이 실행됩니다 쉽습니다.

이 공장에 사용하려는 경우 다음을 수행 할 수 있습니다

function createCallback(limit, fn){ 
    var finishedCalls = 0; 
    return function(){ 
     if (++finishedCalls == limit){ 
      fn(); 
     } 
    }; 
} 


var callback = createCallback(4, function(){ 
    alert("woot!"); 
}); 


async1(callback); 
async2(callback); 
async3(callback); 
async4(callback); 
+1

그런 패턴이 존재한다면, 이것이 그 것이다. –

+0

감사합니다. Sean, 쉽습니다. 답을보기 전에 첫 번째 솔루션과 비슷한 것을 구현하십시오. 하지만 콜백 팩토리가 더 마음에 드는데, 매우 우아합니다. 사용하게됩니다 .-) – Samuel

+0

패턴 인 경우 이름이 있어야합니다. 제안?! – ThomasH

8

난 당신이 귀하의 예를 작성할 수 있도록, 당신이 유용 할 수있는 몇 가지 비동기 유틸리티를 작성했습니다 :

function(callback) { 
    async.series([ 
     asynch1(), 
     asynch2(), 
     ... 
     asynchN() 
    ], callback); 
} 

function(callback) { 
    async.parallel([ 
     asynch1(), 
     asynch2(), 
     ... 
     asynchN() 
    ], callback); 
} 

다른 사용의 부하가있다 : 당신이로, 병렬로 실행하기를 원한다면

또는, 비동기지도와 같은 FUL 기능 /도 감소 :

http://caolanmcmahon.com/async.html

희망이 도움이!

0

약속을 관리하는 데 도움이 될 수 있습니다. 병렬 및 직렬의 두 가지 일반 시나리오가 있습니다. 병렬 작업은 Promise.all()을 사용하여 수행 할 수 있습니다. 직렬 작업은 더 복잡합니다. 작업 B는 작업 A가 완료 될 때만 시작할 수 있습니다. 당신은 브라우저 또는 그 이상 노드 버전에서이 작품을 만들기 위해 몇 가지 ES6/7 번역을해야 할 수도 있습니다

// returns a promise that resolves as the task is done 
const wrap = (fn, delay) => new Promise(resolve => setTimeout(_ => resolve(fn()), delay)); 
const task = (fn, delay) => delay ? wrap(fn, delay) : Promise.resolve(fn()); 

// given a list of promises, execute them one by one. 
const sequence = async l => l.reduce(async (a, b) => [].concat(await a, await b)); 

const tasks = [ 
    task(_ => console.log("hello world")), 
    task(_ => console.log("hello future"), 1000) 
]; 

sequence(tasks).then(_ => console.log("all done")); 

: 여기에 빈약 한 샘플입니다.

관련 문제