javascript - 从匿名函数外部访问变量

标签 javascript node.js express mongoose

我有一个在 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)
    })

})

这里的问题是otherDocsotherDb 中匿名函数的本地函数,我无法从外部访问它并将其插入 myDocs 。我怎样才能做到这一点?

最佳答案

您没有遇到范围问题,而是遇到了异步问题。由于循环内部包含异步代码,因此您必须先等待回调完成,然后才能将它们pushmyDocsres.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);
  });
});

请注意,这将逐一迭代每个 oneDocfind - 如果您想一次而不是并行发送所有请求,请改用 Promise.all

关于javascript - 从匿名函数外部访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504077/

相关文章:

json - "Unexpected token in JSON at position 0"?

mysql - Node - mysql插入中的子查询

node.js - Angular 4 和 SEO

javascript - localhost 不输出我使用的路由器和 Controller 的 JSON

javascript - 如何将变量从服务器js文件传递到另一个文件

javascript - Bootstrap 3 重叠内容问题。侧边栏折叠按钮

javascript - Bootstrap 下 zipper 接不起作用

javascript - 如何在 forEach 中运行 useQuery?

javascript - 使用正则表达式获取 div 中的部分类名称和文本

node.js - 如何调试 yeoman 应用程序?