JavaScriptの非同期実行
2883 ワード
Javascript言語の実行環境は「シングルスレッド」です.「シングルスレッド」とは、一回に一つしかできないミッションのことです.複数のタスクがある場合は、前のタスクを完了し、後のタスクを実行しなければなりません.
このようなモードのメリットは実現が比較的簡単で、実行環境が比較的単純であることです.悪いところは一つのタスクがある限り、時間がかかります.後のタスクは並んで待つ必要があります.プログラム全体の実行を遅らせます.よくあるブラウザでは応答がない(仮死)というのは、JavaScriptコードが長い間実行されているため、ページカード全体がこの場所にあるため、他のタスクが実行できないからです.
JavaScript言語自体は遅くないです.遅いのは、Ajaxが結果を返してくれるのを待って、外部データを読み書きすることです.この時、相手のサーバーがぐずぐずしていたり、ネットワークがうまくいかないと、シナリオが長時間停止してしまいます.
この問題を解決するために、Javascript言語はタスクの実行モードを二つに分けます.同期(Synchronous)と非同期(Aynchronous).「同期モード」は従来のやり方で、後のタスクは前のタスクが終了するのを待ってから実行します.プログラムの実行順序はタスクの順序と一致しています.これは、簡単で速い、IOの読み書きに関係ない操作によく使われます.
「非同期モード」は全く違っています.各タスクは2つのセグメントに分けられています.1番目のセグメントコードは外部データに対する要求を含んでいます.2番目のセグメントコードは1つのコールバック関数として書かれています.外部データに対する処理が含まれています.第一段コードの実行が完了したら、すぐに第二段コードを実行するのではなく、プログラムの実行権を第二のタスクに渡すのです.外部データが戻ったら、システムからの通知で第二のコードを実行します.したがって、プログラムの実行順序はタスクの並び順とは一致しない、非同期である.
以下では「非同期モード」のプログラミングのいくつかの方法をまとめました.構造がより合理的で、性能がより優れ、より便利なJavaScriptプログラムを作成できることを理解しています.
1.コールバック関数
コールバック関数は非同期プログラミングの最も基本的な方法である.2つの関数
2.事件の傍受
もう一つの考えはイベント駆動モードを採用することです.タスクの実行はコードの順序に依存せず、あるイベントが発生するかどうかに依存します.それとも、
この方法の利点は、複数のイベントを結びつけることができ、各イベントは複数のコールバック関数を指定することができ、かつ、「結合」することができ、モジュール化に有利であることである.
3.リリース/購読
「イベント」は完全に「信号」と理解できます.「信号センター」が存在すると、あるタスクの実行が完了し、信号センターに送信します.これは「公開/購読モード」と呼ばれ、また「観察者モード」とも呼ばれています.
このモードは様々な実装があり、以下はBen AlmanのTinPub/Subを採用しています.これはjQueryのプラグインです.
まず、f 2は「信号センター」jQueryに購読します.「done」信号です.
f 2実行が完了したら、購読をキャンセルすることもできます.
参照 Promiseオブジェクト
このようなモードのメリットは実現が比較的簡単で、実行環境が比較的単純であることです.悪いところは一つのタスクがある限り、時間がかかります.後のタスクは並んで待つ必要があります.プログラム全体の実行を遅らせます.よくあるブラウザでは応答がない(仮死)というのは、JavaScriptコードが長い間実行されているため、ページカード全体がこの場所にあるため、他のタスクが実行できないからです.
JavaScript言語自体は遅くないです.遅いのは、Ajaxが結果を返してくれるのを待って、外部データを読み書きすることです.この時、相手のサーバーがぐずぐずしていたり、ネットワークがうまくいかないと、シナリオが長時間停止してしまいます.
この問題を解決するために、Javascript言語はタスクの実行モードを二つに分けます.同期(Synchronous)と非同期(Aynchronous).「同期モード」は従来のやり方で、後のタスクは前のタスクが終了するのを待ってから実行します.プログラムの実行順序はタスクの順序と一致しています.これは、簡単で速い、IOの読み書きに関係ない操作によく使われます.
「非同期モード」は全く違っています.各タスクは2つのセグメントに分けられています.1番目のセグメントコードは外部データに対する要求を含んでいます.2番目のセグメントコードは1つのコールバック関数として書かれています.外部データに対する処理が含まれています.第一段コードの実行が完了したら、すぐに第二段コードを実行するのではなく、プログラムの実行権を第二のタスクに渡すのです.外部データが戻ったら、システムからの通知で第二のコードを実行します.したがって、プログラムの実行順序はタスクの並び順とは一致しない、非同期である.
以下では「非同期モード」のプログラミングのいくつかの方法をまとめました.構造がより合理的で、性能がより優れ、より便利なJavaScriptプログラムを作成できることを理解しています.
1.コールバック関数
コールバック関数は非同期プログラミングの最も基本的な方法である.2つの関数
f1
およびf2
があると仮定し、後者は前者の実行が完了するまでは実行できない.このとき、f1
を書き換え、f2
をf1
のコールバック関数として書き換えることが考えられる.function f1(callback) {
// f1
// f1 ,
callback();
}
実行コードは以下のようになります.f1(f2);
コールバック関数の利点は、単純で分かりやすく配置されており、欠点はコードの読み取りと維持に不利であり、各部分間の高度結合(Coupling)によって、プログラム構造が混乱し、プロセスが追跡しにくくなり(特にコールバック関数がネストされている場合)、各タスクは一つのコールバック関数しか指定できない.2.事件の傍受
もう一つの考えはイベント駆動モードを採用することです.タスクの実行はコードの順序に依存せず、あるイベントが発生するかどうかに依存します.それとも、
f1
とf2
という例である.まず、f 1にイベントを結びつける(ここで使うjQueryの書き方).f1.on('done', f2);
上の行のコードの意味は、f 1がdoneイベントが発生したらf 2を実行するということです.そして、f 1を書き換えます.function f1(){
setTimeout(function () {
// f1
f1.trigger('done');
}, 1000);
}
上記のコードにおいて、f1.trigger('done')
は、実行が完了したら、直ちにdone
イベントをトリガし、f2
の実行を開始すると表している.この方法の利点は、複数のイベントを結びつけることができ、各イベントは複数のコールバック関数を指定することができ、かつ、「結合」することができ、モジュール化に有利であることである.
3.リリース/購読
「イベント」は完全に「信号」と理解できます.「信号センター」が存在すると、あるタスクの実行が完了し、信号センターに送信します.これは「公開/購読モード」と呼ばれ、また「観察者モード」とも呼ばれています.
このモードは様々な実装があり、以下はBen AlmanのTinPub/Subを採用しています.これはjQueryのプラグインです.
まず、f 2は「信号センター」jQueryに購読します.「done」信号です.
jQuery.subscribe("done", f2);
そして、f 1は次のように書き換えられる.function f1(){
setTimeout(function () {
// f1
jQuery.publish("done");
}, 1000);
}
jQuery.publish(「done」)は、f 1の実行が完了したら、「信号センター」jQueryに「done」信号を発信し、f 2の実行を誘発するという意味です.f 2実行が完了したら、購読をキャンセルすることもできます.
jQuery.unsubscribe("done", f2);
この方法の性質は”イベント傍受”と類似しているが,後者より明らかに優れている.「メッセージセンター」を見ることによって、どのぐらいの信号があるか、どのぐらいの受信者がいるかを知ることができますので、プログラムの実行を監視します.参照