两个嵌套的async.each调用

时间:2017-04-07 20:10:44

标签: javascript asynchronous async.js

我有以下方法:

mergeAinBbyAttr: function(a, b, attr1, attr2, val, cb) {
    var result = [];
    async.each(a, function(itemA, cb1) {
        async.each(b, function(itemB, cb2) {
            if (itemA[attr1] == itemB[attr1]) {
              itemB[attr2] = val;
            }
            result.push(itemB);
            cb2(null, result);
          },
          function(e, result) {
            sails.log('[result]', result);
            cb1(e, result);
          });
      },
      function(e, result) {
        cb(e, result);
      });
  }

我基本上想要将对象数组(A)与另一个对象数组(B)进行比较,并返回B中每个项目的更新数组(C),但使用A中的属性进行更新。

上述[result]返回undefined。

由于

2 个答案:

答案 0 :(得分:1)

首先,这是所有同步代码,因此您不需要异步模块,只需要定期循环结构。但我们假设您需要异步。

使用async.map代替async.each,更简洁:

mergeAinBbyAttr: function(a, b, attr1, attr2, val, cb) {

    async.map(a, function(itemA, cb) {
        async.map(b, function(itemB, cb) {
            if (itemA[attr1] === itemB[attr1]) {
              itemB[attr2] = val;
            }
            cb(null, itemB);

          },cb);

      },cb);
  }

您不需要为cb变量命名不同的名称,因为它们具有不同的范围。

如果您想在此例程结束时使用扁平数组,我建议您使用lodash或下划线中的_.flatten_.flattenDeep

请注意:

function(e, result) {
   cb(e, result);
});

可以简化为:

cb

=================================

使用同步方法执行此操作:

    mergeByAttr: function(a, b, attr1, attr2, val) {

      return a.map(function(itemA){
          return b.map(function(itemB){
                if (itemA[attr1] === itemB[attr1]) {
                  itemB[attr2] = val;
                }
                return itemB;
           });

      });
   }

正如您所看到的,无论哪种方式,您将获得嵌套数组,它与async模块无关,但与代码的性质无关。

性能更高但功能更少的方式:

     mergeByAttr: function(a, b, attr1, attr2, val) {

          a.forEach(function(itemA){
              b.forEach(function(itemB){
                    if (itemA[attr1] === itemB[attr1]) {
                      itemB[attr2] = val;
                    }
                    return itemB;
               });

          });
       }

答案 1 :(得分:0)

嗯,我看到上面的答案对你有帮助,只有我想强调一下你的错误:

[result]返回undefined。

是因为根据文档,可选函数只有1个参数,并且你试图得到2个参数:function(e,result)

http://caolan.github.io/async/docs.html#each