Async: 嵌套嵌套异步调用的eachSeries导致超出最大调用堆栈大小

创建于 2016-08-10  ·  3评论  ·  资料来源: caolan/async

您使用的是哪个版本的异步?

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时,以上代码按预期工作。

question

最有用的评论

之所以在异步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')
);

所有3条评论

+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')
);
此页面是否有帮助?
0 / 5 - 0 等级