2013-12-16 13 views
6

私はQライブラリとnodejsに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

「Q.all」を使用しています。ありがとう! – dzm

+0

お元気ですか?Qall解決策 – Krym

+0

ホットコード。間違いなく楽しみと利益のためにこれを使用します。 :) – Antoine