2017-10-12 213 views
0

我真的很头疼,试图在使用for循环时使用异步/等待功能。我正在使用Node.js版本:v8.6.0异步/等待承诺麻烦 - Javascript/Nodejs

简而言之,我试图从数据库中检索许多行,然后将它们全部推送到数组并返回该数组。

我已经成功地完成了这个使用回调,但无法弄清楚如何使用异步/等待。

我当前使用的代码回调,工程

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);    
    }); 
} 

失败尝试使用的代码异步/ 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); 
    }); 
} 

我用Google搜索试图找到一个解决方案,我有尝试使用多个承诺,然后在最后调用return Promise.all(promises);但它没有工作。我试过return new Promise((resolve, reject)=>resolve(dates))};。我曾看过Promise和异步/等待教程和例子,这些教程和例子通常适用于我,但是当涉及到循环访问我所遇到问题的数据时。我知道有一些基本的东西我缺少,所以任何帮助表示赞赏。谢谢!

回答

3

的问题是,你想从db.query回调里面return承诺,which can't work(甚至当你试图用承诺的构造函数,你做到了里面就有,与作为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; 
} 
+0

工作太棒了!现在我明白了许多好的承诺。谢谢 – nd510

0

您没有正确地从你的异步函数返回一个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); 
     }); 
    }); 
} 
+0

您还应该处理错误和异常。 – Bergi

+0

你绝对应该这样做,但这不是他所要求的,我更愿意以确切的所需行为来回答。 –

+0

我不明白他在OP的要求中使用不良做法的问题。 – Bergi