我有一个在 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
。我怎样才能做到这一点?
最佳答案
您没有遇到范围问题,而是遇到了异步问题。由于循环内部包含异步代码,因此您必须先等待回调完成,然后才能将它们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
的 find
- 如果您想一次而不是并行发送所有请求,请改用 Promise.all
。
关于javascript - 从匿名函数外部访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504077/