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

async.detect maximum call stack size exceeded

本文关键字:调用 堆栈 过了 async detect      更新时间:2023-09-26

我有一个对象数组,例如:(但我的实际数组是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:最大调用堆栈大小超过

如何使用我的大型对象阵列来实现此功能

您的"iteratee"是同步的,这导致了堆栈耗尽问题(基本上,它使用相同的堆栈框架在同一个"tick"中处理所有项)。

如果您想使用同步测试设置来测试代码,可以使用async.ensureAsync()来确保迭代变得异步:

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