从匿名函数外部访问变量

时间:2018-05-24 08:02:59

标签: 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。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

您没有范围问题,您有异步问题。由于循环内部具有异步代码,因此您必须等待回调在push myDocsres.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