4

Javascript の setTimeout 関数により、JavaScript について少し知っていることを再評価する必要があります。今日の初めに、次のような for ループに遭遇しました。

for (i = 0; i < length; i++) {
    setTimeout(executeOtherCode, 5000)
}

このコードが実行することを期待していたのは、executeOtherCode 関数を実行し、5 秒間「スリープ」してから、次の反復を続行することでした。代わりに、executeOtherCode が length 回同時に実行されました。

したがって、私の理解では、setTimeout は非同期関数呼び出しです。これは正しいです?しかし、通常の関数を実行する場合、hugeFunction() と呼びましょう。これは実行に 1 分かかりました。その関数が何かを返すまで、次のコード行は実行されませんよね?では、なぜこの 2 つは異なるのでしょうか。単なる言語設計の選択?

getJSON のように、同様に非同期で動作する jQuery の他の関数を見てきました。どの関数が非同期として定義されているかを知るだけの問題ですか、それともそれらを識別するための何らかのパターンがありますか? もしそうなら、何?

4

1 に答える 1

6

通常、特殊なケースを除いて、JavaScript は同期的に順番に実行されます。

setTimeout(executeOtherCode, 5000)

「5秒以内に、関数を実行してください」と言っていますexecuteOtherCode。ループを実行し続け、実行を「ブロック」しません。

5 秒以内に、イベント ループはタイマー (つまり、lengthタイマー) が設定されたことを認識し、それらを (1 つずつ) 実行します。

関数を互いに 5 秒の遅延で実行する場合は、最後の関数が終了してから 5 秒後に次の関数を実行するように指示する必要があります。このパターンは非同期セマフォと呼ばれます。

一般的な経験則では、I/O を行う場合は非同期にする必要があります。そのため、AJAX は非同期 (スクリプト タグ インジェクションなどの他の HTTP 要求も同様) であり、インタラクション イベントは非同期 (JavaScript はクリックに反応します。それらを待ちません)。タイマー (setTimeout と setInterval も非同期です)。

それ以外はすべて同期です。

現在、一部の関数はこれらの他の関数を使用している可能性がありますが、どれがどれであるかを見つけるための特効薬はありません。ドキュメントを明確にするだけです。ほとんどの非同期関数にはコールバック パラメーター (executeOtherCode の最初のパラメーターなど) がありますが、そうでないものもあれば、コールバックを受け入れるが非同期ではない関数もあります。

于 2013-06-22T03:01:33.813 に答える