【问题标题】:Not being able to change value outside the function scope无法在函数范围之外更改值
【发布时间】:2019-09-14 17:23:44
【问题描述】:

即使 user.length 大于零,重复变量也始终为 false。控制台先打印“false”,然后再打印重复记录。

var duplicate = false;
userModel.find({mobileNumber: 123456789},(err, user)=>{
    if(user.length > 0){
        console.log("Duplicate Record");
        duplicate = true;
    }
});
console.log(duplicate);

【问题讨论】:

  • duplicate 被设置为 true,但 console.log 正在运行 before 发生这种情况。处理回调和承诺时的常见陷阱。

标签: node.js mongodb express


【解决方案1】:

Node JS 本质上是异步的,所以它会打印

console.log(duplicate);先运行find函数,

查看日志

var duplicate = false;
userModel.find({mobileNumber: 123456789},(err, user)=>{
    console.log('find function called');
    if(user.length > 0){
        console.log("Duplicate Record");
        duplicate = true;
        console.log('duplicate inside',duplicate);
    }
});
console.log('duplicate outside',duplicate);

【讨论】:

  • 即使 user.length 大于 0,变量 duplicate 的值也始终为 false。内部重复为真,外部重复为假。但是我希望在外部将变量副本更新为 true。
  • 如果你仔细看日志,duplicate outside : false..先打印
  • 你可以使用async / await 或者你可以在find函数里面更新变量值,得到用户后在find函数里面做进一步的操作
【解决方案2】:

duplicate 被读取为 false 的原因是 console.log 的执行是在 MongoDB 查询返回之前完成的(即运行回调以更改副本)。

为了解决这种竞争条件,Mongoose 可以为查询返回 Promise,您可以使用 async/await 来实现您所期望的同步行为。

async () => {
    var duplicate = false;
    let users = await userModel.find({mobileNumber: 123456789}).exec();

    if (users.length > 0) {
        console.log("Duplicate record");
        duplicate = true;
    }

    console.log(duplicate); // true

    // more code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2020-04-20
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多