jsは非同期プログラミングの方式を実現します.

3572 ワード

まず、なぜ非同期プログラミングをするのかというと、何か長所と短所がありますか?
JavaScriptは単一スレッドで実行されるスクリプト言語である(これは歴史的な理由や簡単なために採用された設計かもしれない).その単一スレッド表現は、どの関数も最初から最後まで実行してから、他の関数が実行されます.インタフェースの更新、マウスイベントの処理、タイマー(setTimeout、setIntervalなど)の実行も先に並べて、シリアルで実行します.JavaScriptが最初から最後まで実行時間が長いと、実行中にUIの更新がブロックされ、インターフェースイベントの処理も停止されます.この場合は非同期プログラムモードが必要で、コードの実行をばらばらにしたり、IO呼び出し(例えばAJAX)をバックグラウンドで実行させたりして、インターフェースの更新とイベント処理を適時に実行できるようにすることが目的です.
非同期プログラミングの利点は明らかであり、非同期プログラミングは前の例で実行しながら更新する効果を実現できます.または、非同期のIOを利用して、XMLHT TPRequestの非同期インターフェースを通じてネットワークデータを取得し、取得が完了したらインターフェースを更新し、非同期でデータを取得する際にUIの更新を妨げないようにするなど、UIをよりスムーズに実行させる.
非同期プログラミングにもいくつかの欠点があり、深さ入れ子の関数呼び出しを引き起こし、既存の単純な論理を破壊して、コードを読みにくくしました.
古い決まりです.ブログのリンクを参考にしてください.
js非同期プログラミングの4つの方法
js非同期プログラミング
最初のブログは阮神さんのものです.彼は四つの非同期プログラミング方法をまとめてくれました.それらを理解すると、構造がより合理的で、性能がより優れて、より便利なjsコードを作成できると思います.以下は阮神が書いた四つの方法です.
第一種類:コールバック関数(これは非同期プログラミングの最も基本的な方法です.)
2つの関数f 1とf 2があると仮定し、前者の実行結果を待つ.
f1();
f2();
f 1が時間がかかるタスクであれば、f 1を書き換え、f 2をf 1のコールバック関数として書くことが考えられます.
function f1(callback){
   setTimeout(function () {
    // f1     
    callback();
  }, 1000);
}
f1(f2);
このようにして、同期動作を非同期操作に変えました.f 1はプログラムの実行を滞らせません.先にプログラムを実行する主要なロジックに相当します.時間がかかる操作を実行を遅らせます.
コールバック関数の利点は、単純で分かりやすく配置されており、欠点はコードの読み取りと維持に不利であり、各部分間の高度結合(Couplling)は、プロセスが混乱し、各タスクは一つのコールバック関数しか指定できない.
第二種類:事件の傍受
もう一つの考えはイベント駆動モードを採用することです.タスクの実行はコードの順序に依存せず、あるイベントが発生するかどうかに依存します.
それともf 1とf 2を例にしますか?まず、f 1にイベントを結びつける(ここで使うjQueryの書き方).
f1.on('done', f2);
function f1(){
  setTimeout(function () {
    // f1     
    f1.trigger('done');
  }, 1000);
}
この方法の利点は、複数のイベントを結びつけることができ、各イベントは複数のコールバック関数を指定することができ、かつ「結合解除」(Decoupling)が可能であり、モジュール化を容易にすることができるということである.欠点はプログラム全体がイベント駆動型になり、動作フローが非常に不明瞭になります.
第三種類:リリース/購読
前の節の「事件」は、完全に「信号」と理解できます.私たちは、あるミッションを実行した「信号センター」があると仮定して、信号センターに信号を送ると、他のタスクは信号センターに「購読」(subscribe)という信号を送って、いつ自分が実行できるかを知ることができます.これは「公開/購読モード」と呼ばれ、また「観察者モード」とも呼ばれています.
このモードは様々な実装があり、以下はBen AlmanのTinPub/Subを採用しています.これはjQueryのプラグインです.
まず、f 2は「信号センター」jQueryに「done」信号を購読する.
jQuery.subscribe("done", f2);
function f1(){
  setTimeout(function () {
    // f1     
    jQuery.publish("done");
  }, 1000);
}
jQuery.publish(「done」)は、f 1の実行が完了したら、「信号センター」jQueryに「done」信号を送信し、f 2の実行を誘発するという意味です.また、f 2の実行が完了したら、購読をキャンセルすることもできます.
jQuery.unsubscribe("done", f2);
この方法の性質は「イベントモニター」と類似しているが,後者より明らかに優れている.私たちは「メッセージセンター」を見ることによって、どのぐらいの信号があるか、どのぐらいの予約者がいるかを知ることができます.それによってプログラムの運行を監視します.
第三種類:ES 6のプロモーション対象
PromisesオブジェクトはCommonJS作業グループが提案した仕様で、非同期プログラミングのために統一インターフェースを提供することを目的としています.簡単に言えば、各非同期タスクはPromiseオブジェクトに戻り、オブジェクトにはthenメソッドがあり、コールバック関数の指定が可能です.例えば、f 1のコールバック関数f 2は、「jQuery」と書くことができます.
f1().then(f2);
function f1(){
  var dfd = $.Deferred();
  setTimeout(function () {
    // f1     
    dfd.resolve();
  }, 500);
  return dfd.promise;
}
このように書く利点は、コールバック関数がチェーン式の書き方になり、プログラムの流れがよく見えます.そしてセットの方法があり、多くの強力な機能を実現できます.例えば、複数のコールバック関数を指定します.
f1().then(f2).then(f3);
また例えば、エラーが発生した場合のコールバック関数を指定します.
f1().then(f2).fail(f3);
また、前の3つの方法にはない利点があります.タスクが完了したら、再度コールバック関数を追加してください.このコールバック関数はすぐに実行されます.だから、ある事件や信号を逃したかどうか心配しなくてもいいです.この方法の欠点は編纂と理解で、すべて比較的に難しいです.
プロミスの使い方はこの2つだけではなく、他の用法もあります.プロミスを深く勉強したいなら、公式サイトに行けます.ブロガーは常用部分を勉強しただけです.興味があるなら行ってみてもいいです.リンク:更新待ちです.
JavaScriptの非同期プログラミングモードはトレンドだけでなく必要であるため、HTML 5開発者として非常に必要です.第三者の非同期ライブラリと非同期化の方法を採用すると、コード構造が比較的簡潔になり、メンテナンスが容易になります.