【问题标题】:How to properly call an async forEachOf function nested in a waterfall function如何正确调用嵌套在瀑布函数中的异步 forEachOf 函数
【发布时间】:2018-01-27 23:11:29
【问题描述】:

我在 express js 中使用异步库,但在正确使用回调的两种方法时遇到问题。瀑布最末端的变量 result3 在其范围内完美地显示出来。但是,在需要发送给客户端的结果函数中,它是一个空白数组。提前致谢。

async.waterfall(
  [
    function(callback) {
      someQuery 
      callback(null,result1);
    },

    function(result1, callback) {
      someQuery 
      callback(null,result2);
    },
     function(result2, mainCallback) {
       async.forEachOf(result2, function (result, key, callback) {
         request.query(
          `SELECT * FROM tbl WHERE id = ${result.id};`,
          function(err, recordset) {
            result3 = recordset;
            callback();
          }
        );

       }, function (err) {
         if (err) console.error(err.message);

         mainCallback(null, result3);
       });
    }
  ],
  function(err, result) {

   console.log(result3);
    res.send(
      JSON.stringify({
       result3
      })
    );
  }
);

【问题讨论】:

    标签: javascript node.js express asynchronous


    【解决方案1】:

    您在任务中的result3 应该是您的瀑布回调的result 参数。

    另一方面,如果您切换到 Promise 或 async/await,这一切都会变得更容易。您使用的是什么节点版本,为什么在有这么多其他选项可用时仍然使用回调模式

    这个混乱的承诺可以写成

    somequery() .then(someOtherQuery) .then(someotherThing) .then(Whatever) .catch(your error here)

    使用正确的节点版本甚至更好

    var result1 = await query1(); var result2 = await query2(result1); var result3 = await query3(result2) // do the rest of your stuff

    关键是你真的应该重新考虑你的模式。它没有理由被称为pyramid of doomcallback hell

    【讨论】:

    • 这是正确的,尽管题外话到 async / await 可能会掩盖你的观点:如果你将 console.log(result3); 更改为 console.log(result) 代码应该可以工作。
    • 你是对的,async await 可能是最好的选择,我可能也必须隐藏所有以前的用途。谢谢
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 2023-03-15
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多