3

Node.jsをあまり長く使用していないので、次の問題が発生しました。コールバック駆動型パラダイムを使用して、同期コードで使用したループを再帰に変換する必要があることを理解しています。私の問題は、ノードが再帰でどの程度深くなるかを理解できないことです。異なるテストでの結果には一貫性がありません。たとえば、Webで見つけたコードを試しました。

    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();
    })();

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();
    });
})();

まだ終了していませんが、これまでのところ400万回以上の再帰で機能します(実際にはキューがいっぱいになっています)。そこで、ノードで再帰深度制限がどのように機能するかを明確にしたいと思います。私の推測では、再帰的に呼び出される関数で何かを行うと、ノードは呼び出しスタックを解放するためのより多くの時間を持っていますが、私はひどく間違っている可能性があります。より経験豊富なノードユーザーからの説明は大歓迎です。

4

1 に答える 1

5

2番目の例には再帰はまったくありません。

最初の例では、明らかに再帰呼び出しがあります。

2番目の例では、すぐに戻るmemcacheq.setが呼び出され、関数が戻ります。トリガーされたイベントが後で発生したときに呼び出す関数のどこかにノードが作成されます。

---再帰呼び出しは行われません---

ある時点で、memcache関数が終了し、イベントをイベントキューにキューイングして、コールバックをトリガーします。

ただし、これはイベントキュー内のイベントから行われることに注意してください。関数からの直接の再帰呼び出しではなく、おそらく長い間返されます。

于 2011-10-04T09:12:18.337 に答える