我正在尝试从数据库中获取列表列表,将列表格式化为列表项中包含“ name”的字符串,然后返回结果。我以为我已经正确设置了异步并等待,但是结果在解决承诺之前就作为承诺提前返回了。关于获取异步函数的任何提示,直到承诺被解决后才返回?
exports.viewListsNamesSMS = async () => {
let formatResult = (messages) => {
let temp = [];
for(let i = 0; i < messages.length; i ++)
{
temp.push(messages[i].name.toString());
}
return "Lists: \n" + temp.join('\n');
}
let getListNames = async () => {
let result = await db.List.find({}, (err, messages) => {
if(err) return err;
return formatResult(messages);
});
return result;
}
let result = getListNames();
return result;
}
答案 0 :(得分:0)
db.List.find看起来并不像返回Promise的东西,因此您需要Promisify
exports.viewListsNamesSMS = () => {
let formatResult = (messages) => {
let temp = [];
for(let i = 0; i < messages.length; i ++) {
temp.push(messages[i].name.toString());
}
return "Lists: \n" + temp.join('\n');
}
let getListNames = () => {
return new Promise((resolve, reject) => {
db.List.find({}, (err, messages) => {
if(err) {
reject(err);
} else {
resolve(formatResult(messages));
}
});
}
return getListNames();
}
知道async/await
不仅会等待任何异步操作完成可能很有用-它是Promises的语法糖,因此{ {1}}将“等待”诺言解决
由于您所需的代码很简单,只需一个异步操作本身不会返回Promise,因此根本不需要使用async / await-只要您需要返回Promise,调用该函数的代码被编写为使用Promises(或异步等待)
例如
await
或
viewListNamesSMS().then(results => process(results))