JavaScript变量范围问题?

时间:2018-09-26 06:33:13

标签: javascript node.js mongodb mongoose

我用过猫鼬 Node.js ,而我正面临这个问题:

var dbvar;
doc_model
  .findOne({aadhar})
  .then(()=>{
    dbvar=1;
  });
paramedic_model
  .findOne({aadhar})
  .then(()=>{
    dbvar=2;
  });
console.log(dbvar);

我的MongoDB中有2个集合,我想相应地更改变量dbvar。但是当到达console.log(dbvar)时,会显示未定义

4 个答案:

答案 0 :(得分:1)

您是shadowing your variable dbvar,请尝试在`.then()'函数中删除变量dbvar声明。

console.log也应该放在`.then()'内,这样您就可以在建立连接时看到变量被填充(我以为您是异步的)。

var dbvar;
  doc_model
    .findOne({aadhar})
    .then(()=>{
       dbvar=1;
       console.log(dbvar);
    });
  paramedic_model
    .findOne({aadhar})
    .then(()=>{
      dbvar=2;
      console.log(dbvar);
    });

答案 1 :(得分:0)

是的。在JavaScript中,函数中的声明不会泄漏到外部。

您的问题是名称隐藏:通过在函数内部再次声明dbvar,可以在外部{strong>阴影。在函数中声明dbvar后,对该名称 dbvar 的所有访问都将进入该内部变量。

我认为只是这样删除:

dbvar

应该工作

另一方面,您必须从当时的回调内部访问结果。在继续操作之前,您应该多看一下Promise概念:)

答案 2 :(得分:0)

如果您想查看dbvar在改变它的值。

在您的通话中控制台:

var dbvar;
doc_model
  .findOne({aadhar})
  .then(()=>{
     dbvar=1;
     console.log(dbvar);
  });
paramedic_model
  .findOne({aadhar})
  .then(()=>{
    dbvar=2;
    console.log(dbvar);
  });

答案 3 :(得分:0)

您正在进行一些异步调用。因此js的工作方式如下,您.findOne().then()的调用可能需要一些时间(可能要花几秒钟)才能完成,但是在此期间JS将继续遍历您的代码,以便到达console.log(dbvar);代码的最后一行。此时dbvar是未定义的,因为您像这样var dbvar全局声明了它,但没有任何值。一段时间之后,您的.findOne()将完成,因此dbvar的值将为1和2,但是在未定义时,您已经打印了该值。

您的代码没有问题,只需要将控制台日志放入.then()调用中

var dbvar;
doc_model
  .findOne({aadhar})
  .then(()=>{
    dbvar=1;
    console.log(dbvar);
});
paramedic_model
  .findOne({aadhar})
  .then(()=>{
    dbvar=2;
    console.log(dbvar);
});