有 Async/Await 承诺的麻烦 - Javascript/Nodejs

Having Async/Await Promise troubles - Javascript/Nodejs

我真的很头疼在使用 for 循环时尝试使用 async/await 功能。我使用的是 Node.js 版本:v8.6.0

简而言之,我试图从数据库中检索许多行,然后将它们全部推送到一个数组,然后 return 该数组。

我已经使用回调成功完成了此操作,但无法弄清楚如何使用 async/await。

我当前使用有效回调的代码

function main(db) {
    gatherDates(db, function(dates) {
        console.log(dates); //successful
    });
}

function gatherDates(db, callback) {
    const dates = [];
    let today = getToday();

    dates.push(today);

    let dateQuery = "SELECT date FROM event_dates";

    db.query(dateQuery, (err, newDates) => {
        for(let row of newDates) {
            dates.push(row.date);
        }
        callback(dates);            
    });
}

尝试使用失败的代码async/await

async function main(db) {
    let dates = await gatherDates(db);
    console.log(dates); //undefined or not all of the data
}

function gatherDates(db) {
    const dates = [];
    let today = getToday();

    dates.push(today);

    let dateQuery = "SELECT date FROM event_dates";

    db.query(dateQuery, (err, newDates) => {
        for(let row of newDates) {
            dates.push(row.date);
        }
        return Promise.resolve(dates);
    });
}

我用谷歌搜索试图找到一个解决方案,我试过使用多重承诺然后在最后调用 return Promise.all(promises); 但它没有用。我试过了return new Promise((resolve, reject)=>resolve(dates))};。我查看了 Promise 和 async/await 教程和示例,这些教程和示例通常对我有用,但是当涉及到循环数据时,我遇到了问题。我知道我缺少一些基本的东西,所以感谢任何帮助。谢谢!

问题是您正试图从 db.query 回调中 return 承诺,which can't work (and even when you tried to use the promise constructor, you did it inside there, with the same effect as Promise.resolve()). The proper way to promisify 是在外部使用 new Promise,这样您就可以return 它来自你的外部函数,只将 resolve 放在异步回调中。

function query(sql) {
    return new Promise((resolve, reject) {
        db.query(sql, (err, res) => {
            if (err) reject(err);
            else resolve(res);
        });
    });
}

async function gatherDates(db) {
    const dates = [getToday()];
    const newDates = await query("SELECT date FROM event_dates");
    for (let row of newDates) {
        dates.push(row.date);
    }
    return dates;
}

您没有从异步函数中正确返回 Promise 对象,解决方法如下:

function gatherDates(db) {
    const dates = [];
    let today = getToday();
    dates.push(today);
    let dateQuery = "SELECT date FROM event_dates";

    return new Promise((resolve) => {
        db.query(dateQuery, (err, newDates) => {
            for(let row of newDates) {
                dates.push(row.date);
            }
            resolve(dates);
        });
    });
}