Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存在异步/等待承诺问题-Javascript/Nodejs_Javascript_Node.js_Promise_Async Await_Ecmascript 2017 - Fatal编程技术网

存在异步/等待承诺问题-Javascript/Nodejs

存在异步/等待承诺问题-Javascript/Nodejs,javascript,node.js,promise,async-await,ecmascript-2017,Javascript,Node.js,Promise,Async Await,Ecmascript 2017,在使用for循环时,尝试使用异步/等待功能确实让我头疼。我正在使用Node.js版本:v8.6.0 简而言之,我试图从数据库中检索许多行,然后将它们全部推送到一个数组并返回该数组 我已经使用回调成功地做到了这一点,但是我不知道如何使用async/await来做到这一点 使用有效回调的当前代码 function main(db) { gatherDates(db, function(dates) { console.log(dates); //successful

在使用for循环时,尝试使用异步/等待功能确实让我头疼。我正在使用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 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);
    });
}

我曾在谷歌上尝试寻找解决方案,我曾尝试使用多个promise,然后调用
return promise.all(promises)在最后,但它不起作用。我尝试了
返回新承诺((解决,拒绝)=>解决(日期))。我看过Promise和async/await教程和示例,它们通常对我有用,但当涉及到数据循环时,我遇到了问题。我知道我缺少一些基本的东西,所以我非常感谢你的帮助。谢谢大家!

问题在于,您试图从
db.query
回调中
返回
承诺(甚至当您试图使用承诺构造函数时,您也在其中执行了该操作,其效果与
promise.resolve()
相同)。方法是在外部使用
newpromise
,这样您就可以
从外部函数返回它,并且只将
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;
}

问题是,您试图从
db.query
回调中
返回
承诺(甚至当您试图使用承诺构造函数时,您也在其中执行了该操作,其效果与
promise.resolve()
相同)。方法是在外部使用
newpromise
,这样您就可以
从外部函数返回它,并且只将
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);
        });
    });
}

您没有从异步函数正确返回
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在他的问题中要求在哪里使用坏习惯。坏习惯?当然。你绝对应该这样做,但那不是他要求的,我更愿意用确切的要求来回答。我不明白OP在他的问题中要求在哪里使用坏习惯。坏习惯?当然,很好!现在我更了解承诺了。谢谢你工作得很好!现在我更了解承诺了。非常感谢。