如何正确调用嵌套在瀑布函数中的async forEachOf函数

时间:2018-01-27 23:11:30

标签: javascript node.js express asynchronous

我在快速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
      })
    );
  }
);

1 个答案:

答案 0 :(得分:1)

你的result3来自任务,它应该是瀑布回调的result参数。

另一方面,如果切换到promises或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