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());
答案 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-返回承诺。那时,您有另一个具有不同本地(词法?)作用域的线程