【问题标题】:node.js async waterfall for each in array数组中每个的node.js异步瀑布
【发布时间】:2017-11-29 09:35:38
【问题描述】:

我有一个允许用户评论电影的应用程序,我正在尝试添加一项功能,该功能可以从电影中抓取海报并将其显示在评论旁边。我尝试使用

查询数据库并返回电影列表 => imdb-id 获取 IMDB ID => imdb 获取海报 url => 将其添加到变量并使用 pug 编译

但是,我无法让它工作,因为数组总是先返回空,然后再运行其他任何东西。我尝试使用异步瀑布,但我不知道如何遍历返回的数组,并传递 ID 以获取 url

async.waterfall([
    function (callback) {
        console.log('Request Id:', username);
        var query = "SELECT title, rating, review FROM movies WHERE username = \"" + username + "\" ORDER BY title;";
        callback(null, query);
    }, function (query, callback) {
        // Run query on db
        connection.query(query, callback);
    }, function (rows, fields, cb) {
        // Get array of titles
        var rowArray = rows;
        console.log(rowArray);
    }
],
function(err) {
    // error stuff
})

【问题讨论】:

  • 为什么不使用 Promises 或 async/await 来代替?
  • 这是异步的,但我会检查 Promises
  • 我知道这也是异步的,但是我说的是原生的 async / await,它实际上是 promise 的语法糖。我不确定你的目标是什么节点版本/es 版本,所以我不能告诉你是否可以使用它。如果可以,我可以推荐你使用它,因为它使代码更具可读性。
  • 哦,好吧。我想我实际上会用 AJAX 来做这件事,它会让事情变得容易得多。无论如何,谢谢!
  • 什么?您提供了 node.js 作为标签,这意味着您在这里谈论的是后端代码。您通常从不从前端运行数据库查询。无论如何,我发布了一个答案来解释你如何解决它。这应该有助于前端和后端编程。

标签: javascript node.js


【解决方案1】:

我建议您改用 Promise 或 es2017 async/await。

旁注:异步瀑布中的第一个块无论如何都是同步的,您不会在那里执行任何冗长的操作。您可以将 connection.query 行合并到其中。

使用 async/await,您的代码可能如下所示:

async function sendQuery() {
  console.log('Request Id:', username);
  const query = "SELECT title, rating, review FROM movies WHERE username = \"" + username + "\" ORDER BY title;";

  try {
    const rows = await connection.query(query);
    console.log(rowArray);
  } catch(err) {
     console.log(err);
  }
}

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 2014-10-31
    • 1970-01-01
    • 2012-10-17
    • 2018-04-29
    • 1970-01-01
    • 2015-07-18
    • 2016-05-20
    相关资源
    最近更新 更多