【问题标题】:Having Async/Await Promise troubles - Javascript/Nodejs遇到 Async/Await Promise 问题 - Javascript/Nodejs
【发布时间】:2018-03-24 17:09:37
【问题描述】:

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

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

我已经使用回调成功地做到了这一点,但不知道如何使用 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 教程和示例,这些教程和示例通常对我有用,但是当涉及到循环数据时,我遇到了问题。我知道我缺少一些基本的东西,因此感谢您提供任何帮助。谢谢!

【问题讨论】:

    标签: javascript node.js promise async-await ecmascript-2017


    【解决方案1】:

    问题是你试图从db.query 回调,which can't work 内部return 承诺(即使你尝试使用承诺构造函数,你也在里面做了,效果相同如Promise.resolve())。 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;
    }
    

    【讨论】:

    • 效果很好!现在我更好地理解了承诺。谢谢
    【解决方案2】:

    您没有从异步函数中正确返回 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);
            });
        });
    }
    

    【讨论】:

    • 你绝对应该这样做,但这不是他要求的,我更愿意用确切要求的行为来回答。
    • 我看不出 OP 在他的问题中哪里需要使用不良做法。
    • 不好的做法?当然。
    猜你喜欢
    • 2019-04-30
    • 2019-08-11
    • 2020-12-19
    • 2019-12-30
    • 1970-01-01
    • 2020-12-11
    • 2018-12-05
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多