2

コール スタックのサイズを爆発させないために、JavaScript で現在のコール スタックを終了したいのですが、setTimeout()コールにアクセスできません。

関数setTimeoutは私の環境には存在しません:)

コール スタック サイズの制限に達したため、現在のコール スタックを終了する必要があります。

環境は「parse.com」と CloudCode モジュールです。背後で何が実行されているかを知っている人がいれば、それも役立ちます。

推測はありますか?

PS: 質問を -1 する必要があるのは、あなたが知っている唯一のことが Web ブラウザー環境と DOM ノード操作、またはさらに悪い Javascript であるからではありません。これは本当に適切です。すべての機能がどこにでも実装されているわけではありません。PS2: 応用問題というよりも理論的な問題であるため、ソース コードは添付されていません。

4

2 に答える 2

3

Javascript は例外オブジェクト (実際には何でもかまいません) のスローをサポートしており、必要なだけコール スタックを終了できます。この MDN ページは役に立つかもしれません:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/try...catch

于 2012-11-30T00:25:19.423 に答える
0

JayC の回答に基づいて、呼び出す関数のキューを保持し、それらをループで実行できます。ループで「exit callstack」例外をキャッチし、次の関数を実行します。

関数はそのnextTick引数をキューに追加します。

var queue = [];

function nextTick(f) {
    queue.push(f);
}

while (queue.length > 0) {
    try {
        var fun = queue.shift();
        fun();
    }
    catch (ex) {
        if (ex !== 'exit callstack') {
            // Handle "real" exceptions here
        }
    }
}

私はコードをテストしていませんが、アイデアはうまくいくはずです。もちろん、1 つの注意点は、非同期関数で例外処理を使用できないことです ("exit callstack" 例外をチェックして再スローしない限り)。

于 2012-11-30T00:56:14.767 に答える