您使用的是哪个版本的异步?
2.0.1
问题发生在哪个环境中(节点版本/浏览器版本)
节点6.2.1
NPM 3.9.3
你做了什么?
let counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
pCb();
},
], cb);
},
() => console.log('done')
);
您期望发生什么?
我希望每次迭代都会发生,这将导致最后两个console.log分别为“ 1”和“ done”。
实际结果是什么?
少于1000次迭代后,我将收到此错误:
RangeError:超出最大调用堆栈大小
当我恢复到异步1.5.2时,以上代码按预期工作。
+1
+1
之所以在异步1.5.2中起作用,是因为我们确保在该版本中始终以异步方式调用回调。 在版本2中,我们删除了此防护措施(请参阅https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
因此,根据您的情况来修复脚本,可以使用async.ensureAsync(cb)
或async.setImmediate(cb)
来解决递归问题:
var counter = 2000;
async.eachSeries(
new Array(counter),
(item, cb) => {
async.parallel([
(pCb) => {
console.log(counter--);
async.setImmediate(pCb);
},
], cb);
},
() => console.log('done')
);
最有用的评论
之所以在异步1.5.2中起作用,是因为我们确保在该版本中始终以异步方式调用回调。 在版本2中,我们删除了此防护措施(请参阅https://github.com/caolan/async/blob/master/intro.md#synchronous-iteration-functions)
因此,根据您的情况来修复脚本,可以使用
async.ensureAsync(cb)
或async.setImmediate(cb)
来解决递归问题: