我想根据请求中作为数组传递的条件执行n个查询。我能够轮流执行所有查询,但有时在第一次查询之前执行第二次查询,因此只显示第二次查询的结果。
这是我到目前为止所做的。
var where_clauses = condition_array;
return new Promise(function (resolve, reject) {
var counter = [];
async.series([
function (counterCB) {
where_clauses.forEach(function (where_clause, i) {
Model.count(where_clause, function (err, result) {
if (err) {
return counterCB(err);
}
console.log('result', result);
counter.push(result);
if ((where_clauses.length - 1) === i) {
return counterCB(null, counter);
}
});
});
}
], function (err, result) {
console.log('counter', counter);
return err ? reject(err) : resolve(counter);
});
});
以下是此输出。
输出1:
result 26627
result 37630
counter [ 26627, 37630 ] // This is return array
输出2:
result 37630
counter [ 37630 ] // This is return array
result 26627
现在我希望所有查询的结果都存储在数组中,而不是在我需要返回之后。任何人都可以帮助我吗?
答案 0 :(得分:0)
快速解决方案只是改变您设置结束条件的方式。由于您的异步回调可能以任何顺序执行,因此您不应在“最后一次”回调之后结束,而是在您获得预期结果数之后结束。
尝试更改此内容:
ClaimsSchema
到此:
if ((where_clauses.length - 1) === i) {
return counterCB(null, counter);
}
但是,每次要等待多个查询完成时都要设置它很困难,并且值得使用其中一个库来使其更容易。我使用Q。然后,当我想等待多个查询时,它看起来像这样:
if (counter.length >= where_clauses.length) {
return counterCB(null, counter);
}
我大多是这样做的 - 一次启动多个查询,然后在我获得所有结果后运行一些代码......但是Q还有很多其他实用方法。
希望这有帮助!
更新
如果您需要可变数量的异步调用,可以通过将一组promises传递给Q然后使用传播回调中的var Q = require('q');
module.exports = {
getLotsOfData: function(req, res) {
Q.all([
User.find({flagged: true}),
Group.find({flagged: true}),
someOtherCustomPromise(args)
]).spread(function(users, groups, otherpromiseresult) {
// do whatever you want with all three result sets
return res.send({
users: users,
groups: groups,
otherResult: otherpromiseresult
});
}).fail(function(err) {
// handle the error
});
},
// etc
}
关键字访问结果来处理它:
arguments