在嵌套循环中将对象推送到Array

时间:2016-09-14 18:37:00

标签: arrays node.js asynchronous foreach callback

在两个嵌套循环完成迭代后,我在发送填充数组时遇到了困难。我正在使用Async npm库并尝试使用async.forEach完成回调来发送整个数组。内部数组迭代5个对象,构成一个“课程” - 之后课程对象被保存到人物对象,每个人对象有多个课程对象。

    var self = this,
    person = [],
    course = [];


    async.forEach(elements.value, function (element, callback1) {
      self.elementIdElements(element.ELEMENT, 'td').then(function (rows) {
        async.forEach(rows.value, function (cell, callback2) {
          self.elementIdText(cell.ELEMENT).then(function (res) {
            course.push(res.value);
            callback2();
          });
        }, callback1);
        person.push(course);
        course = [];
      });
    }, function (err) {
      res.send('grades: ' + JSON.stringify(person));
    });

然而,它在遍历数组的过程中调用sendResponse,我根本无法幻想为什么会发生这种情况,它应该在遍历整个事件之后调用它。范围和异步调用令人困惑

提前致谢, 克里斯

更新 - 解决方案

我终于通过以下代码找出了回调的范围:

var self = this,
    person = [],
    course = [];

    async.forEach(elements.value, function (element, callback1) {
      self.elementIdElements(element.ELEMENT, 'td').then(function (rows) {

        async.forEach(rows.value, function (cell, callback2) {
          self.elementIdText(cell.ELEMENT).then(function (res) {
            course.push(res.value);
            callback2();
          });

        }, function (err) {
          person.push(course);
          course = [];
          callback1();
        });

      });
    }, function (err) {
      res.send('grades: ' + JSON.stringify(person));
    });

1 个答案:

答案 0 :(得分:0)

您必须将回调嵌套在彼此之内。使用异步库,许多调用的最后一个参数是“最终回调”,它可以让您知道何时完成所有操作。

你是外async.forEach看起来不错,sendResponse的最终回调是最后的论据。

更改内部async.forEach,因此callback是最终参数。 async.forEach(rows.value, getCourseData, callback)

我可能还会建议更多描述性的回调名称,以便您可以轻松跟踪(“innerCallback”“outerCallbacl”或“rowsCallbacl”......无论您想要什么)