存在异步/等待承诺问题-Javascript/Nodejs
在使用for循环时,尝试使用异步/等待功能确实让我头疼。我正在使用Node.js版本:v8.6.0 简而言之,我试图从数据库中检索许多行,然后将它们全部推送到一个数组并返回该数组 我已经使用回调成功地做到了这一点,但是我不知道如何使用async/await来做到这一点 使用有效回调的当前代码存在异步/等待承诺问题-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
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在他的问题中要求在哪里使用坏习惯。坏习惯?当然,很好!现在我更了解承诺了。谢谢你工作得很好!现在我更了解承诺了。非常感谢。