【问题标题】:is there a non-recursive feature implemented in `async`?`async` 中是否实现了非递归功能?
【发布时间】:2014-12-05 15:42:54
【问题描述】:

我需要使用async.eachasync.eachSeriesasync.whilst等函数处理大量条目(数万个)。

说我必须使用async 几乎是多余的,因为我将为每个条目调用一些查询,从而使代码异步。

不幸的是,使用async 的函数,调用堆栈被消耗得非常快,导致RangeError: Maximum call stack size exceeded

有没有办法调整async 来防止这个问题?迭代实现将解决该问题。有没有考虑到这个问题的替代库?

这是一个显示问题的示例代码 sn-p:

async = require('async');

a = []
for(i = 0; i < 10000000; i++) {
    a[i] = i;
}

async.eachSeries(a,function(element,callback) {
    console.log(element);
    callback();
},function(err){
    if(err){
        console.log("error:",err);
    }
    console.log("finished.");
});

【问题讨论】:

  • 不,但是通过使用您自己的堆栈,您通常可以在没有递归的情况下重述递归方法。提供更多代码,我会提供答案...
  • 这是脚本的代码,如果有点乱,请见谅,正在重构:nopaste.info/ca0c118591.html

标签: javascript node.js asynchronous stack


【解决方案1】:

您正在寻找的是tail recursion。检查这个问题:What is tail recursion?

【讨论】:

  • 我使用的是async,所以我不是应该实现这个的人。我不认为async 使用尾递归。
  • @fstab 那么,传递给async 的函数不是递归的吗?
  • 不是本身,而是,例如,async.whilst 通过多个函数的组合使其递归
猜你喜欢
  • 2013-06-09
  • 2013-10-30
  • 2017-10-10
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 2013-11-10
相关资源
最近更新 更多