我有一个对象数组,例如:(但我的真实数组是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:超出了最大调用堆栈大小
如何使用大量对象进行此操作?
答案 0 :(得分:1)
你的"iteratee"是同步的,这导致了堆栈耗尽问题(基本上,它处理相同的所有项目" tick",使用相同的堆栈帧)。
如果要使用同步测试设置测试代码,可以使用async.ensureAsync()
确保iteratee变为异步:
async.detect(
items,
async.ensureAsync(function hasItemName(item, cb) {
return cb(null, item.name === itemName);
}),
...
);