簡體   English   中英

遇到Async / Await Promise麻煩-Javascript / Nodejs

[英]Having Async/Await Promise troubles - Javascript/Nodejs

在使用for循環時,嘗試使用異步/等待功能確實讓我頭疼。 我正在使用Node.js版本:v8.6.0

簡而言之,我試圖從數據庫中檢索許多行,然后將它們全部推送到一個數組中並返回該數組。

我已經使用回調成功完成了此操作,但無法弄清楚如何使用異步/等待。

我當前的代碼使用有效的回調

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 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 Promise.all(promises); ,然后調用return Promise.all(promises); 最后,但沒有成功。 我試過return new Promise((resolve, reject)=>resolve(dates))}; 我看過Promise和async / await教程和示例,這些教程和示例通常對我有用,但是當涉及到遍歷數據時,這是我遇到的問題。 我知道我缺少一些基本知識,因此可以提供任何幫助。 謝謝!

問題是您試圖從db.query回調內部return promise,該回調不起作用 (即使當您嘗試使用promise構造函數時,您也可以在其中執行它,其效果與Promise.resolve()相同Promise.resolve() )。 new Promise正確方法是在外部使用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);
        });
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM