gpt4 book ai didi

javascript - Q.allSettled 在将任何内容推送到数组之前执行

转载 作者:行者123 更新时间:2023-12-03 11:54:11 26 4
gpt4 key购买 nike

我正在尝试学习如何将 Promise 与数组和一些异步 mongo 查询一起使用。这是我当前拥有的方法,但是在我的 mongo 查询之前,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;
}

最佳答案

有两件事:

Q.allSettled 将仅捕获调用时数组中的 Promise。您需要等待,直到填充数组,也许需要完成上面的 each 调用。

另一个是Q.defer()返回一个{promise,resolve}对。您只需将promise 添加到promise 数组中。

promises.push(def.promise);

关于javascript - Q.allSettled 在将任何内容推送到数组之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25674534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com