我有一条路线在2个不同的数据库中执行2次查询,如下所示:
app.post('/location',function(req,res){
Db.find({id:anId},function(err,doc){
myDocs=[]
for (var i = doc.length - 1; i >= 0; i--) {
myDocs.push(doc[i])
otherDocs=[]
otherDb.find({id:doc[i].id},function(err,doc2){
for (var i = doc2.length - 1; i >= 0; i--) {
otherDocs.push(doc2[i])
}
})
myDocs.push(otherDocs)
}
res.send(myDocs)
})
})
此处的问题是otherDocs
是otherDb
中匿名函数的本地,我无法从外部访问它并将其推送到myDocs
。我怎么能这样做?
答案 0 :(得分:3)
您没有范围问题,您有异步问题。由于循环内部具有异步代码,因此您必须等待回调在push
myDocs
和res.send
之前完成。
最简单的解决方案是将函数async
然后await
分别设置为内.find
(转换为Promise
):
app.post('/location',function(req,res){
Db.find({id:anId}, async function(err,doc){
const myDocs = [];
for (const oneDoc of doc.reverse()) {
myDocs.push(oneDoc);
const doc2 = await new Promise(res => {
otherDb.find({id: oneDoc.id}, (err,doc2) => res(doc2));
});
myDocs.push(doc2.reverse());
}
res.send(myDocs);
});
});
请注意,这将逐个遍历每个oneDoc
的{{1}} - 如果您想一次发送所有请求而不是并行发送请求,请改用find
。