我正試圖學習如何使用數組和一些異步mongo查詢的promise。這是我目前使用的方法,但Q.allSettled
在我的mongo查詢b/c之前執行,沒有任何數據已被推送到Q.allSettled
正在查看的陣列。Q.allSettled在將任何內容推送到數組之前執行
如何修改此方法以便在執行Q.allSettled.spread
之前執行所有異步查詢?
function buildCaseObject() {
var returnPromise = Q.defer();
var promises = [];
var allObjects = [];
var subjects = rdb.collection('subjects');
var observations = rdb.collection('observation');
// Loop through all subjects from current subject list
subjects.find({'player._id': {$elemMatch: {root: '1.2.3.99.100.2', extension: {$in : subjectList}}}}).each(function(err, subject) {
var def = Q.defer();
promises.push(def);
if (err) {
def.reject(err);
} else if (subject== null) {
return def.resolve();
}
var caseObject = {};
caseObject.subject= clone(subject);
// Add observations to the subject
observations.find({subjectId: subject._id}).toArray(function(err, allObs) {
if (err) {
def.reject(err);
}
caseObject.observations = clone(allObs);
allObjects.push(caseObject);
def.resolve();
});
});
Q.allSettled(promises).then(function() {
// GETTING IN HERE BEFORE GETTING INTO THE CALLBACK OF subjects.find.
// THEREFORE THE ARRAY IS EMPTY
console.log('in spread');
console.log(allObjects.length);
returnPromise.resolve(allObjects);
}).fail(function(err) {
returnPromise.reject(err);
});
return returnPromise.promise;
}
您應該promisify mongo,然後撰寫諾言 - 查找是異步的,所以allSettled運行在一個空數組並立即返回。 – 2014-09-04 20:34:42
這或多或少是我在我的問題中指出的。我不知道該怎麼做,因此問題:p – Catfish 2014-09-04 20:39:15
http://stackoverflow.com/questions/22519784/how-do-i-convert-an-existing-callback-api-to-promises並且還閱讀http://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it – 2014-09-04 20:41:38