我正在尝试填充outputArray,然后将其作为JSON发送。当我在console.log()
之后添加outputArray.push
时,我可以看到outputArray正在填充。但是在底部函数中,它会打印一个空数组。我看到底部函数在数组填充之前有效。如何修改下面的代码,以便我可以收到完整的数组。提前谢谢。
var outputArray = [];
async.each(generalArr, function(item, callback)
{
var docs = collection.find({ id: { "$in": item}}).toArray();
docs.then(function(singleDoc)
{
if(singleDoc)
{
outputArray.push.apply(outputArray, singleDoc);
}
});
callback(null, outputArray);
}, function(err,results)
{
if (err)
return console.log('ERROR', err);
console.log(results);
res.json(results);
}
)
答案 0 :(得分:5)
代码中有一些错误。
callback(null, outputArray)
。它应该在最里面的if
条件async.each
最终回调只需要一个参数 - err
,因此results
不可用以下代码应该有效......
var outputArray = [];
async.each(generalArr, function(item, callback) {
var docs = collection.find({ id: { "$in": item}}).toArray();
docs.then(function(singleDoc) {
if(singleDoc) {
outputArray.push.apply(outputArray, singleDoc);
}
callback();
});
}, function(err) {
if (err) return console.log('ERROR', err);
console.log(outputArray);
res.json(outputArray);
});
我假设{promise}承诺查询的catch
代码也存在,否则最终的回调可能永远不会被调用。
答案 1 :(得分:3)
当普通承诺变得如此简单时,不要使用async.js:
Promise.all(generalArr.map(function(item) {
return collection.find({id: {"$in": item}}).toArray();
})).then(function(outputArray) {
var results = outputArray.filter(Boolean);
console.log(results);
res.json(results);
}, function(err) {
console.log('ERROR', err);
});