async.detect最大调用堆栈大小超过

时间:2016-05-15 13:32:12

标签: javascript node.js asynchronous

我有一个对象数组,例如:(但我的真实数组是13000长)

var items = [
  {
    name: "cat",
    id: "1"
  },
  {
   name: "dog",
    id: "2" 
  }
];

我正在尝试迭代对象,直到找到name的对象

然而,当使用这个大型数组(13000 size)时,我获得了超出最大调用大小,如果我使用上面的数组,我没有错误。

异步代码:

function getItemIdByName(itemName, done) {
  async.detect(
    items,
    function hasItemName(item, cb) {
      return cb(null, item.name === itemName);
    },
    function(err, result) {

      if (err) {
        return done(new Error(err));
      }

      if (_.isUndefined(result)) {
        return done(new Error("Item not found"));
      }

      done(null, result);
    });
};

getItemIdByName('Dog', function foundItem(err, itemId) {
  console.log("got error", err);
  console.log("got item", itemId);
});

我在控制台中获得了正确的输出

got error null
got item { id: 2, name: 'dog' } 

但是我也得到了RangeError:超出了最大调用堆栈大小

如何使用大量对象进行此操作?

1 个答案:

答案 0 :(得分:1)

你的"iteratee"是同步的,这导致了堆栈耗尽问题(基本上,它处理相同的所有项目" tick",使用相同的堆栈帧)。

如果要使用同步测试设置测试代码,可以使用async.ensureAsync()确保iteratee变为异步:

async.detect(
  items,
  async.ensureAsync(function hasItemName(item, cb) {
    return cb(null, item.name === itemName);
  }),
  ...
);