13

John Resigの著書「Secrets of the Javascript Ninja」の中で、彼は次のように主張しています。

ブラウザーのプログラミングも同じですが、コードがイベント ループの実行とイベントのディスパッチを担当していない点が異なります。ブラウザがそれを処理します。

私たちの責任は、ブラウザーで発生する可能性のあるさまざまなイベントのハンドラーをセットアップすることです。これらのイベントは、発生するとイベント キュー (FIFO リスト。詳細は後述) に配置され、ブラウザーはこれらのイベントに対して確立されたハンドラーを呼び出して、これらのイベントをディスパッチします。

これらのイベントは予測不可能なタイミングで予測不可能な順序で発生するため、イベントの処理、つまりそれらの処理関数の呼び出しは非同期であると言います。

ここでの非同期という用語の使用を受け入れるのに苦労しています。彼は本当に年代学を意味していませんか?それらは非同期の場合もありますが、このステートメントをサポートするために提示された理由からではありません。考え?

4

7 に答える 7

3

質問のタイトルと質問の本文は、2 つの異なることを求めているようです。私は両方に対処しようとします。

ボディクエスチョン

非同期は John が作り出した用語でも、JavaScript 固有の用語でもありません。これは、コンピューター サイエンスにおいて確立された意味を持ちます。ジョンの言うことは正確ですが、不完全だと思います。彼は、私たちが非同期という用語を使用する理由 (語源) を正しく説明していますが、非同期プログラミングとは何かについては説明していません。

コンピューター サイエンスでは、非同期とはコードの実行を一時停止し、他の (任意の) コードを同じスレッドで実行できるようにし、最終的に一時停止したコードを再開することを意味します。これを達成するための多くのテクニックと、プログラマーのためにこれを抽象化する多くの方法がありますが、それらはすべて、コードをブロックするのではなく中断するという特徴を共有しています。これは、遅いリソース (HTTP 要求、ファイル、またはデータベースなど) を待っている間にスレッド全体がブロックされるのを避けるために利用されます。

たとえば、同期HTTP リクエストを行う場合、リクエストが完了するまで他の JavaScript は実行できません。したがって、JavaScript に依存する Web ページのどの部分も凍結されます。ただし、非同期HTTP 要求を行う場合、要求を待機している間、要求を行うコードが中断される可能性があります。これにより、他のコードを実行できます。HTTP 要求が完了したら、要求コードを再開できます。

John が非同期コードが発生する可能性があると言う理由は、外部リソースがいつ利用可能になるかわからないためです。たとえば、2 つ以上の非同期 HTTP 要求を行う場合、要求がどの順序で完了するかを知る方法はありません (その結果、コードがどの順序で再開されるか)。

タイトルの質問

ブラウザー イベントは、サンプルの HTTP 要求と同じように非同期です。実際、多くの点で、ユーザーは別の外部リソースにすぎません。ユーザーは、現在実行中のコードとは非同期に、自分の時間に何かを行います。

たとえば、コードでページ上のボタンのクリック イベントのハンドラーを定義するとします。JavaScript コードは、ユーザーがボタンをクリックするのを待ちません。クリック ハンドラーのコードを一時停止し、後でユーザーがボタンをクリックしたときに実行します。これは、JavaScript で非同期プログラミングが非常に重要である理由の核心になります。HTTP 要求が完了するまでコードが単純にブロック (待機) された場合、ユーザーはボタンをクリックできませんでした。また、ユーザーが何かをクリックするのを待っている間にコードがブロックされた場合、HTTP 要求はタイムアウトになります。

最終的な考え

JavaScript では、コードの中断と再開について考えることはあまりありません。実際、実行中のコード ブロックの途中で一時停止することはできません。ブロックは、他の何かが実行される前に常に完了します。代わりに、コード ブロックからコールバックを渡し、後で実行します。これらのコールバックは、元のコード ブロックからリソース (スコープ) にアクセスできます。コールバックは、元のコンテキストから再開されるものです。

JavaScript が同時実行モデルとイベント ループを管理する方法について詳しく知りたい場合、これは良いリソースです。また、JavaScript は、 PromisesGeneratorsなど、コールバックを超えたイベント ループにいくつかの強力な抽象化を追加しました。これらは時間を費やす価値があります。

于 2016-04-05T20:18:17.803 に答える
3

これらのイベントは予測不可能なタイミングで予測不可能な順序で発生するため、イベントの処理、つまりそれらの処理関数の呼び出しは非同期であると言います。

これはうそです。おそらく、ポイントを作るための少し誇張です。でも;

  • 順序が明確に定義されていないイベントは、予測できない順序で発生する可能性があります。

    例: AJAX リクエスト - 最初に到着するレスポンスは?

  • 順序が明確に定義されたイベント、予測可能な順序で発生します。

    例: setTimeout(a); setTimeout(b);-aは の前に呼び出されbます。

一粒の塩でそれを取り、それを作りすぎないでください.

于 2013-03-10T02:19:25.433 に答える
2

ajax リクエストのイベント処理は、ユーザーが開始したイベントの場合と同じです。を呼び出すとxhmlhttprequest.open、要求の完了時にイベントによって処理される非同期呼び出しが開始されますonreadystatechange(いつ発生する可能性があります)。同様に、ユーザーはいつでも DOM 要素でイベントを開始できます。

イベントの処理とそのコールバックの呼び出しは非同期ですが、必ずしもコールバック自体とは限りません。

私もこれを定義として見つけました:

指示 (信号) の受信時に特定の操作が開始される、コンピュータ制御タイミング プロトコルの形式の、または要求する

そのシグナルは、クリック イベントまたは xmlhttprequest の準備状態の変化である可能性があります。

于 2013-03-10T01:49:41.290 に答える
0

Resig が意味することは、UI イベントはブラウザによって非同期的に処理されなければならないということだと思います。通常、デスクトップ ソフトウェアはマルチスレッドでこの問題を解決します。Web アプリは、イベント ループを使用して非同期性を実現する JavaScript に依存しています。

于 2013-03-10T01:50:05.130 に答える
-1

JavaScript は非同期です...呼び出したメソッドがまだ返されていなくても、コードを処理し続けます...はい、それは正しいです。それが非同期のまさに定義です: 同期されていません...

私はあなたのクエリを取得します... FIFOのため...しかし、使用されている用語は適切だと思います...彼らが述べているとおりに定義されているためです。

于 2013-03-10T01:35:33.673 に答える