angglarjsの中の非同期問題について話します.


前回会ったその問題のために、ここでangglarjsの非同期問題を徹底的に調べてからanglarjsの非同期について話しましょう.JavaScriptは単スレッドの遊びであることを知っています.単スレッドとは、このコードを実行するには、前の全部が終わってからあなたの番になります.(トイレの中には穴があります.感覚は木があります.)このようなモードでは、普通ではない簡単なことが実現されます.秩序がいいですしかし、もちろん、ここでは実行効率が非常に低いという問題が見られます.だからJavaScriptはもう一つのモードが現れました.非同期モードです.いわゆる非同期モードとは、各タスクには1つ以上のコールバック関数があり、前のタスクの実行が完了した後は後のタスクを実行するのではなく、コールバック関数を実行し、その後は1つのタスクも前のタスクの実行が完了するまで待つ必要はありません.ここでは异歩と同期についてよく知っていると思いますが、ここでは必要ないです.ここでは非同期モードでプログラミングする四つの方法を簡単に説明します.
f1(); f2();
f 1の実行が終わったらf 2を実行します.ここでは破損関数で具体的な使用を解決できます.
function f1(callback){
    setTimeout(function () {
      // f1     
      callback();
    }, 1000);
  }
だから、私たちのコードはf 1(f 2)になります.この方法を採用すると同期は非同期になります.
コールバック関数の利点は、単純で分かりやすく配置されており、欠点はコードの読み取りと維持に不利であり、各部分間の高度結合(Couplling)は、プロセスが混乱し、各タスクは一つのコールバック関数しか指定できない.
二、イベント傍受のもう一つの考えはイベント駆動モードを採用することです.タスクの実行はコードの順序に依存せず、あるイベントが発生するかどうかに依存します.それともf 1とf 2を例にしますか?まず、f 1にイベントを結びつける(ここで使うjQueryの書き方).f 1.on('done',f 2)上の行のコードの意味は、f 1がdoneイベントが発生したらf 2を実行するということです.そして、f 1を書き換える.
function f1(){
    setTimeout(function () {
      // f1     
      f1.trigger('done');
    }, 1000);
  }
f 1.trigger('done')は、実行が完了したら、すぐにdoneイベントをトリガし、f 2を実行するという方法の利点が分かりやすく、複数のイベントを結びつけることができ、各イベントは複数のコールバック関数を指定することができ、かつ、「結合に行く」ことができ、モジュール化に有利であるという.欠点はプログラム全体がイベント駆動型になり、動作フローが非常に不明瞭になります.
三、私達は「信号センター」が存在すると仮定して、あるミッションの実行が完了したら、信号センターに「発信」します.他のタスクは信号センターに「購読」という信号があり、いつから自分で実行できるかが分かります.これは「公開/購読モード」と呼ばれ、また「観測者モード」とも呼ばれています.このモードは様々な実装があります.以下はBen AlmanのTinPub/Subを採用しています.これはjQueryのプラグインです.まず、f 2は「信号センター」jQueryに「done」信号を購読します.jQuery.subscribe(「done」,f 2);そして、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」、f 2);この方法の性質は「イベントモニター」と類似しているが,後者より明らかに優れている.私たちは「メッセージセンター」を見ることによって、どのぐらいの信号があるか、どのぐらいの予約者がいるかを知ることができます.それによってプログラムの運行を監視します.
四、Promisesオブジェクト(個人的にはこれを勧めます)これはとても重要です.後のanglarjsは非同期を扱うのにもよく使われています.この方法は簡単に言えば、非同期タスクごとにPromiseオブジェクトに戻ります.例えば、f 1のコールバック関数f 2は、f 1().then(f 2);f 1は以下のように書き換えます.
function f1(){
    var dfd = $.Deferred();
    setTimeout(function () {
      // f1     
      dfd.resolve();
    }, 500);
    return dfd.promise;
  }
このように書く利点は、コールバック関数がチェーン式の書き方になり、プログラムの流れがよく見えます.そしてセットの方法があり、多くの強力な機能を実現できます.例えば、複数のコールバック関数を指定します.f 1().then(f 2).then(f 3);また、エラーが発生した場合のコールバック関数を指定します.f 1().then(f 2).fail(f 3);また、前の3つの方法にはない利点があります.タスクが完了したら、再度コールバック関数を追加してください.このコールバック関数はすぐに実行されます.だから、ある事件や信号を逃したかどうか心配しなくてもいいです.この方法の欠点は編纂と理解で、すべて比較的に難しいです.
anglarjsでpromiseも私達がよく使う非同期の処理方法です.後にanglarjsの中の非同期と処理の方法を整理してまとめます.