[英]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.