arrays - 嵌套在 async.eachSeries 循环中的 async.series 终止提前发送 POST 响应

标签 arrays node.js asynchronous node-async

我位于 POST 调用的接收端,其中包含对象数组 (requestArray)。在响应 POST 之前,我需要按顺序通过一系列函数传递数组的对象。我选择了异步库来帮助我完成此任务,但是我很难控制代码的执行流程。

我使用全局数组来存储每个函数的结果(responseArray)。某些函数取决于先前函数的结果。我不想使用 async.waterfall() 因为 1. 我必须重写我的代码 2. 我可能会遇到同样的早期循环终止问题。下面是我的代码有问题的代码。

app.post('/test', function(req, res) {
  var importArray = req.body;
  var iteration = 0;

  async.eachSeries(importArray, function(data, callback) {
    var index = importArray.indexOf(data);
    var element  = data.element;
    exportArray[index] = [];

    async.series([
      function(callback) {
        process1(data, index, callback);
      },
      function(callback) {
        process2(element, index, callback);
      },
      function(callback) {
        process3(element, index, callback);
      }],
      function(err, results) {  
        var str = {};
        results.forEach(function(result) {
          if (result) {
              str += result + ',';
          }
        });
        //callback();       // callback here = synchronous execution.
        if (index === req.body.length - 1) {
          res.send(exportArray);
        }
      });
      console.log('async.eachSeries() callback iteration # = ' + iteration);
      iteration++;
      callback();           // callback here = asynchronous execution.
  }, function(err){
      if( err ) {
        console.log('Error');
      } else {
        console.log('All data has been processes successfully.');
      }
  });
});

async.series() 中的每个函数都会返回回调(null, result)。 process1() 返回其回调后,async.eachSeries() 跳转到之前的下一个数组条目,这是理想的。但是,async.eachSeries() 在返回所有 async.series() 结果之前执行 POST 响应。我如何修改我的代码,以便在发送 POST 响应之前从 process1 - 3 返回所有 importArray 结果 (exportArray) 之后 async.eachSeries() 完成执行?

最佳答案

为了便于遵循代码的异步性质,我建议稍微重命名您的回调。另外,要等待eachSeries 完成,请将res.send 移动到传入resultseachSeries 最终回调。

这是更新后的代码。

app.post('/test', function(req, res) {
  var importArray = req.body;
  var iteration = 0;

  async.eachSeries(importArray, function(data, next) {
    var index = importArray.indexOf(data);
    var element  = data.element;
    exportArray[index] = [];

    async.series([
      function(cb) {
        process1(data, index, cb);
      },
      function(cb) {
        process2(element, index, cb);
      },
      function(cb) {
        process3(element, index, cb);
      }],

      function(err, results) {  
        var str = {};
        results.forEach(function(result) {
          if (result) {
              str += result + ',';
          }
        });

        console.log('async.eachSeries() callback iteration # = ' + iteration);
        iteration++;
        next(null, results);      
      });     

  }, function(err, results){
      if(err) {
        return console.log('Error');
      } 

      res.send(exportArray);
      console.log('All data has been processes successfully.');
  });
});

关于arrays - 嵌套在 async.eachSeries 循环中的 async.series 终止提前发送 POST 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30230109/

相关文章:

c# - 任务已安排并等待运行但从未执行

javascript - Node.JS 异步回调

c - 在函数中使用 scanf 输入更新数组元素(使用指针访问)

java - 无法在 Switch 语句中实例化字符串数组 - Java

node.js - 使用nodejs连接Hbase实例

node.js - 检查 NodeJS 中延迟的异步代码

c# - 将 await 与 MessageDialog.ShowAsync() 一起使用时出错

vb.net - 在 VB.Net 中将变量写入预先存在的数组

c - 数组中的模式出现

javascript - Jest automock 失败 : TypeError: fs. readdirSync 不是函数