基本node.js - 变量和Mongoose范围

时间:2018-03-16 11:16:24

标签: node.js mongoose

console.log(workingWeekdaysVar)行;在findOne的范围之外,变量也在它之外声明,但是它给了我null ...

当我把console.log(workingWeekdaysVar);在findOne的范围内,它确实给出了正确的输出,但这对我来说没用,因为我想在下面的其他地方使用workWeekdaysVar。

两条注释掉的行是我试图做的第二种方法,但是它给了我一个不合需要的输出,因为整个代码都在一个复杂的for循环中。

如何简单地将workingWeekdaysVar的获取值传递出范围?

    var workingWeekdaysVar = [];

                    buyerSupplierFisModel.findOne(filter).then(function (combo) {

                        workingWeekdaysVar = combo.workingWeekdays;

                         //server.getWorkingWeekdays = function () { return combo.workingWeekdays };

                    });

   console.log(workingWeekdaysVar);

//console.log(server.getWorkingWeekdays());

2 个答案:

答案 0 :(得分:1)

findOne()是一个异步函数(它返回一个promise对象)。这意味着它会立即返回并运行您的下一个代码行(在本例中为console.log(workingWeekdaysVar);。但是,由于该函数尚未完成,workingWeekdaysVar为空,它将为空直到findOne()完成其工作并将结果返回到提供的链式回调.then(function (combo) {...

因此,如果您想对结果做任何事情,那么您必须在回调中执行此操作。一个选项是使用async / await

(async () => {
    try {
        const { workingWeekdaysVar } = await buyerSupplierFisModel.findOne(filter)
        console.log(workingWeekdaysVar)
    } catch (e) {
        console.log(`Error: ${e}`);
    }
})()

答案 1 :(得分:0)

稍微重新排列代码:

let doToResponse = (combo)=>{
 workingWeekdaysVar = combo.workingWeekdays; 
 console.log(workingWeekdaysVar);
}
 buyerSupplierFisModel.findOne(filter).then(function (combo) {
                        doToResponse(combo)
                    });
  • 有利于重用

我个人的最爱:

buyerSupplierFisModel.findOne(filter).then(combo=> {
    workingWeekdaysVar = combo.workingWeekdays; 
    console.log(workingWeekdaysVar);
});

重要的是要牢记,正如MiguelCalderón所说的那样。findOne-返回承诺。那时,您有另一个具有不同本地(词法?)作用域的线程