2014-02-25 69 views
0

我有一個for-loop語句和一個異步MongoDB內部循環體。我想要做的是從我的MongoDB數據庫中查詢find,並將結果推送到數組中。如何同步NodeJS中的MongoDB異步查詢

下面是代碼:

function() arrResult() { 
    var arr = []; 
    for(...) { 
    collection.find({ foo: i }, function (err, cursor) { 
     arr.push(cursor); 
    }  
    } 
    return arr; 
} 

但很明顯,該函數的返回值將是一個空數組。

我想用Q模塊來解決這個問題。有沒有解決方法?

回答

2

我想用Q模塊解決這個問題。有沒有解決方法?

是的,承諾是一個非常簡單的抽象來處理這個問題。您可以並行執行查詢,並通過all收集其結果。

特別是,Q它應該是這樣的:

function arrResult(…) { 
    var promises = []; 
    for (…) 
     promises.push(Q.ninvoke(collection, "find", {foo: i})); 
    return Q.all(promises); 
} 

arrResult(…).then(function(arr) { 
    … 
}, function(err) { 
    // first error, if any occured 
}); 
+0

太好了。你能用Q.defer()來完成嗎? –

+0

@AshshinMehrabani:爲什麼我需要?一個[從不使用'Q.defer'](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#wiki-the-deferred-anti-pattern)。 'Q.ninvoke'和另一個[回調函數方法](https://github.com/kriskowal/q/wiki/API-Reference#wiki-promise-for-function-methods)完全避免了這一點。 – Bergi

+0

僅用於教育目的。 –

1

您需要一個類似於進程門的同步機制。每個返回的查詢必須到達門口,例如,遞減一些計數器並存儲其結果。 當所有人到達大門口時,最終回調確實會返回收集到的結果。

+0

有趣的......你有任何的例子?我非常感興趣 – tymeJV

+0

我手工編碼,但它必須存在於Node.js生態系統中。給我一下。 – mvw

+0

@mvw:你正在尋找[async.js''parallel' function](https://github.com/caolan/async#parallel)...但是,請注意OP要使用Q. – Bergi