Node.js中的最大递归深度为0.4

Ily*_*nov 3 recursion depth node.js

因为我使用Node.js的时间不长,我遇到了以下问题.我理解使用回调驱动的范例我们需要将我们在同步代码中使用的循环转换为递归.我的问题是我无法理解递归的深度节点,不同测试的结果是不一致的.例如,我尝试了在网上找到的代码:

    var depth = 0;

    (function recurseBaby() {
        // log at every 500 calls
        (++depth % 500) || console.log(depth);

        // bail out ~100K depth in case you're special and don't error out
        if (depth > 100000) return;

        recurseBaby();
    })();
Run Code Online (Sandbox Code Playgroud)

它在18500次递归后给出了节点异常(最大递归深度).所以我尝试添加一些功能,比如使用队列:

var depth = 0,
    Memcached = require('memcached'),
    memcacheq = new Memcached('127.0.0.1:22201');


(function recurseBaby() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);

    // bail out ~10M depth in case you're special and don't error out
    if (depth > 10000000) return;

    memcacheq.set('test_queue', 'recurs' + depth, 0, function (error, response) {
        return recurseBaby();
    });
})();
Run Code Online (Sandbox Code Playgroud)

它还没有完成,但到目前为止已经进行了超过400万次递归(并且队列实际上正在填补).所以我想澄清一下,递归深度限制如何在节点中起作用.我的猜测是,如果我在递归调用函数中执行某些操作,节点有更多时间来释放调用堆栈,但我可能非常错误.欢迎来自更有经验的节点用户的任何澄清.

jco*_*der 5

在你的第二个例子中根本没有递归.

在第一个例子中,你显然有一个递归调用.

在第二个例子中,调用memcacheq.set,它立即返回,然后你的函数返回.当触发事件稍后发生时,它将在函数的某个位置创建一个节点.

---没有递归调用---

在稍后的某个时间点,memcache函数将完成并将事件排队到事件队列以触发您的回调.

但请注意,这是通过事件队列中的事件完成的,而不是来自函数的直接递归调用,该函数可能早已返回.