Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从匿名函数外部访问变量_Javascript_Node.js_Express_Mongoose - Fatal编程技术网

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);
  });
});