【问题标题】:Async function returning before promise is resolved..JS, MondoDB, Twilio在 promise 被解决之前返回的异步函数..JS,MondoDB,Twilio
【发布时间】:2018-12-29 06:57:45
【问题描述】:

我正在尝试从我的数据库中获取列表列表,将该列表格式化为列表项中包含“名称”的字符串并返回结果。我以为我已经正确设置了 async 和 await ,但是在解决承诺之前,结果会作为承诺提前返回。在承诺解决之前获得异步函数不返回的任何提示?

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;

}

【问题讨论】:

  • 那么,db.List.find 返回一个承诺?看起来不像,看起来像一个常规的节点回调样式函数

标签: javascript mongodb asynchronous async-await


【解决方案1】:

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的语法糖,所以await将“等待” Promise 解决

由于您需要的代码很简单,只需一个异步操作本身就不会返回 Promise,甚至根本不需要使用 async/await - 只要返回 Promise 即可编写调用此函数的代码以使用 Promises(或异步等待)

例如

viewListNamesSMS().then(results => process(results))

results = await viewListNamesSMS();
process(results)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2017-10-16
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2018-04-13
    • 2019-10-23
    相关资源
    最近更新 更多