我在while循环中调用异步函数时遇到问题。
问题是'while'语句将在其基础函数结果出现之前结束,那是因为它是异步函数。 代码如下:
while (end < min) {
db.collection('products').count({
tags: {
$in: ['tech']
}
}, function(err, result) {
if (result) {
a = result;
}
});
max = min;
min = max - step;
myitems.push(a);
}
res.send(myitems);
并且最后我无法发送结果,因为所有迭代都应该在发送最终结果之前完成。 我怎么能修改代码来解决这个问题?
提前致谢
答案 0 :(得分:1)
不使用第三方库,这是一种手动排序异步操作的方法。请注意,因为这是异步的,所以当您看到迭代完成后,您必须在next()
函数内部处理结果。
// assume that end, max, min and step are all defined and initialized before this
var results = [];
function next() {
if (end < min) {
// something seems missing from the code here because
// this db.collection() call is always the same
db.collection('products').count({tags: {$in: ['tech']}}, function(err, result) {
if (!err && result) {
results.push(result);
max = min;
min - max - step;
next();
} else {
// got an error or a missing result here, provide error response
console.log("db.collection() error or missing result");
}
}
} else {
// all operations are done now
// process the results array
res.send(results);
}
}
// launch the first iteration
next();
答案 1 :(得分:0)
您可以利用第三方库来执行此操作(使用async的非工作performQuery示例):
function performQuery(range, callback) {
// the caller could pre calculate
// the range of products to retrieve
db.collection('products').count({
tags: {
$in: ['tech'],
// could have some sort of range query
$gte: range.min,
$lt: range.max
}
}, function(err, result) {
if (result) {
callback(result)
}
});
}
async.parallel([
performQuery.bind(null, {min: 0, max: 10}),
performQuery.bind(null, {min: 10, max: 20})
], function(err, results) {
res.send(results);
});