2013-12-16 6 views
6

node12에 Q 라이브러리와 async 라이브러리를 사용하고 있습니다.nodejs에서 비동기 및 Q 약속

여기 내 코드의 예 :

async.each(items, cb, function(item) { 

saveItem.then(function(doc) { 
    cb(); 
}); 

}, function() { 

}); 

saveItem는 약속이다. 이걸 실행할 때 나는 항상 cb is undefined을 얻었고, then()에는 액세스 권한이 없다고 생각합니다. 어떤 아이디어가이 문제를 해결하는 방법?

답변

20

귀하의 문제는 약속과 관련이 없으며 귀하의 사용법은 async입니다.

async.each(items, handler, finalCallback)items 배열의 모든 항목에 handler을 적용합니다. handler 함수는 비동기식입니다. 즉, 작업이 끝나면 호출해야하는 콜백이 전달됩니다. 모든 핸들러가 완료되면 최종 콜백이 호출됩니다. 특히, 약속 혼자 아주 능숙하게이 작업을 채우기 : 그러나

var handler = function (item, cb) { 
    saveItem(item) 
    .then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
); 
} 

var finalCallback = function (err, results) { 
    // ... 
} 

async.each(items, handler, finalCallback); 

, 당신은 코드의 특정 부분에 대한 async를 사용할 필요가 없습니다 : 여기

는 현재의 문제를 직접 해결하려면 방법 Q.all() :

// Create an array of promises 
var promises = items.map(saveItem); 

// Wait for all promises to be resolved 
Q.all(promises) 
.then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
) 
+0

'.all'을 사용하여 완벽하게 작동합니다. 감사합니다! – dzm

+0

위대한 당신은'Q.all' 해결책을 언급했다 – Krym

+0

핫 코드. 확실히 재미와 이익을 위해 이것을 사용할 것입니다. :) – Antoine