在答应解决之前返回的异步函数..JS,MondoDB,Twilio

时间:2018-07-20 23:11:06

标签: javascript mongodb asynchronous async-await

我正在尝试从数据库中获取列表列表,将列表格式化为列表项中包含“ 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;

}

1 个答案:

答案 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))