Pat*_*ors 24 javascript asynchronous node.js promise
我正试图通过Node.js的async/await功能来使用Mongoose promises.当我的函数printEmployees
被调用时,我想保存由orderEmployees
函数查询的员工列表.同时,console.log
语句内部orderEmployees
返回预期的查询,返回的console.log
内部,表明我没有正确地返回promise.printEmployees
undefined
我很容易接受承诺,以至于我没有正确理解范式......任何帮助都非常感激.
printEmployees: async(company) => {
var employees = await self.orderEmployees(company);
// SECOND CONSOLE.LOG
console.log(employees);
},
orderEmployees: (companyID) => {
User.find({company:companyID})
.exec()
.then((employees) => {
// FIRST CONSOLE.LOG
console.log(employees);
return employees;
})
.catch((err) => {
return 'error occured';
});
},
Run Code Online (Sandbox Code Playgroud)
Tam*_*dus 28
为了使orderEmployees
行为像异步函数,您必须返回结果承诺.使用没有async/await
关键字的promises时要遵循两条规则:
Promise
.then
它或返回它.当你使用时,async/await
你必须遵守 await
你所获得的承诺.
这说你会注意到你没有返回内部产生的承诺orderEmployees
.易于修复,但也很容易将该功能重写为异步.
orderEmployees: (companyID) => {
return User.find({company:companyID}) // Notice the return here
.exec()
.then((employees) => {
// FIRST CONSOLE.LOG
console.log(employees);
return employees;
})
.catch((err) => {
return 'error occured';
});
},
Run Code Online (Sandbox Code Playgroud)
要么
orderEmployees: async(companyID) => {
try {
const employees = await User.find({company:companyID}).exec();
console.log(employees);
return employees;
} catch (err) {
return 'error occured';
}
},
Run Code Online (Sandbox Code Playgroud)
PS:错误处理在这里有些缺陷.我们通常不会通过从函数返回错误字符串来处理错误.在这种情况下,最好让错误传播,并从一些顶级UI代码处理它.
Nik*_*des 20
你需要return
你Promise
,否则你正在等待返回的功能undefined
.
orderEmployees: (companyID) => {
return User.find({ company:companyID }).exec()
}
Run Code Online (Sandbox Code Playgroud)
你只能throw
承诺; 或者标记为的函数return
,它基本上返回一个.catch
.