Javascript 从匿名函数外部访问变量
我有一个在两个不同数据库中执行两个查询的路由,如下所示:Javascript 从匿名函数外部访问变量,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我有一个在两个不同数据库中执行两个查询的路由,如下所示: 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=[]
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
。我怎样才能做到这一点呢?您没有范围问题,您有一个异步问题。因为循环内部有异步代码,所以必须先等待回调完成,然后才能将它们推送到myDocs
和res.send
最简单的解决方法是使函数异步
,然后等待每个内部。查找(转换为承诺
):
请注意,这将逐个遍历每个oneDoc
的find
——如果要同时发送所有请求而不是并行发送,请使用Promise.all
。如果没有范围问题,则存在异步问题。因为循环内部有异步代码,所以必须先等待回调完成,然后才能将它们推送到myDocs
和res.send
最简单的解决方法是使函数异步
,然后等待每个内部。查找(转换为承诺
):
请注意,这将逐个遍历每个oneDoc
的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);
});
});