遇到 Async/Await Promise 问题 - Javascript/Nodejs
Posted
技术标签:
【中文标题】遇到 Async/Await Promise 问题 - Javascript/Nodejs【英文标题】:Having Async/Await Promise troubles - 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 教程和示例,这些教程和示例通常对我有用,但是当涉及到循环数据时,我遇到了问题。我知道我缺少一些基本的东西,因此感谢您提供任何帮助。谢谢!
【问题讨论】:
【参考方案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 在他的问题中哪里需要使用不良做法。 不好的做法?当然。以上是关于遇到 Async/Await Promise 问题 - Javascript/Nodejs的主要内容,如果未能解决你的问题,请参考以下文章
将 Promise 转换为 async/await - Javascript