超过了async.detect最大调用堆栈大小
async.detect maximum call stack size exceeded
我有一个对象数组,例如:(但我的实际数组是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);
}),
...
);
相关文章:
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 超过了async.detect最大调用堆栈大小
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 超过了最大调用堆栈大小,循环无限
- 超过了最大调用堆栈大小.递归标签
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
- jQuery捕获"RangeError:超过了最大调用堆栈大小“;
- 设置这个.RangeError:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 递归 - 测试最大堆栈大小时,调用堆栈无法弹出
- 轮询 ajax 函数超出调用堆栈
- Chrome RangeError:使用jQuery$.map时超过了最大调用堆栈大小
- 要求JS 2.1.9引起“;最大调用堆栈"使用Grunt时出错
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 超过了最大调用堆栈大小-没有明显的递归
- 警告:字体加载过程中出错:轨道上的PDFJS超过了最大调用堆栈大小错误