Async / Await Promise麻烦 - Javascript / Nodejs

时间:2017-10-12 16:56:39

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

在使用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);
    });
}

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

2 个答案:

答案 0 :(得分:3)

问题是,您正在return回调which can't work内尝试db.query承诺(即使您尝试使用承诺构造函数,也是它在里面,效果与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; } 放在异步回调中。

.zip

答案 1 :(得分:0)

您没有正确地从异步函数返回.jsthtml对象,这是解决方案:

Promise