1

私のコードが正しく動作する理由を理解するのに問題があります:)

これが私のコードの一部です:

function updateForNextLecturer(current_id, all_lecturers, progressbar)
{
    $.getJSON(
        '/' + root + 'custom/ajax/update_timetable_lecturer.php?id=' + all_lecturers[current_id],
        function(data)
        {
            if (data.successfull == 0) {
                $.stickr({note: "Error occurred.", className: "classic error"});
                throw new Error("error");
            }

            else {
                percent = Math.round((current_id + 1) * 100.0 / all_lecturers.length);
                progressbar.progressbar({value: percent});

                if (current_id + 1 < all_lecturers.length)
                    updateForNextLecturer(current_id + 1, all_lecturers, progressbar);
                else 
                    $.stickr({note: "Success", className: "classic"});
            }
        }
    );
}

このコードは、すべての講師の時間割を更新するために必要です。リクエストは非同期で次から次へと送信されるため、Web サーバーに大きな負荷がかかることはありません。

リクエストを次々と行うには、再帰コールバックを使用する必要があります (これが唯一の解決策だと思います)。そして問題は、なぜこれが正しく機能するのか、PHP のように最大ネスト レベルがないのでしょうか? PHPでは、次のエラーが発生する可能性があります

Fatal error: Maximum function nesting level of '100' reached, aborting!

この関数は数千のリクエストでテストしたため、ネスト レベルは数千程度ですが、エラーは発生しませんでした。それは、JavaScript に入れ子の制限がまったくないからですか、それとも私が何かを理解していないからですか?

前もって感謝します。

4

1 に答える 1

1

それは本当に再帰的ではありません。updateForNextLecturer後に終了し$.getJSONます。リクエストが完了すると、匿名関数が呼び出されます。これは、匿名コールバック関数の実行を含むすべてのイベントを処理するメインループの一部として発生します。

したがって、特定の時間に実行されるのは最大で 1 つだけupdateForNextLecturerであり、ネストされた関数呼び出しはまったくありません。ただし、$.getJSON.

これが非同期 JavaScript の威力です。準備が整ったときに物事が起こる可能性があります。

ランニングキッズアナロジー

Ulec と Jason の 2 人の子供がいるとします。あなたは両方のタスクを与えます:

  • Ulec は、Jason に照会したい情報をいくつか提供します。
  • ジェイソンは、準備ができたらウレクに情報を提供します。

今、ウレックは彼の仕事を始めます。彼はジェイソンに仕事を与え、ジェイソンは逃げます。Ulec は何も待ちません。Ulec は仕事を終え、ただそこに座って自分の環境を眺めています。彼はまったく働いていません。一方、ジェイソンは必要な情報をすべて入手し、それをメールと一緒にウレックに送り返します。ジェイソンも仕事を終えました。

しばらくすると、ウレックはメールを受け取り、ジェイソンに別の仕事がなくなるまで、ジェイソンに別の仕事を与えます。

この例では、Ulec はupdateForNextLecturer、Jason は$.getJSONです。メールは、実際には ajax リクエストが成功した後のわずかな待機時間であり、メイン ループでのイベント処理です。

これは、再帰呼び出しとの大きな違いです。この場合、Ulec は自分自身に仕事を与えるか、自分自身のクローンを作成して自分自身に仕事を与えます。しかし、クローン作成は長続きしません。また、必要なすべてのジョブを覚えておくこともできません。

于 2013-04-02T16:02:06.197 に答える