ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript で非同期プログラミング パターンを実装する方法

JavaScript で非同期プログラミング パターンを実装する方法

coldplay.xixi
coldplay.xixiオリジナル
2021-04-12 16:54:333035ブラウズ

JavaScript で非同期プログラミング モードを実装する方法: 1. 非同期プログラミングの最も基本的な方法であるコールバック関数、2. イベント リスニング、3. パブリッシュまたはサブスクライブ、4. Promises オブジェクト。

JavaScript で非同期プログラミング パターンを実装する方法

このチュートリアルの動作環境: Windows 7 システム、JavaScript バージョン 1.8.5、DELL G3 コンピューター。

JavaScript で非同期プログラミング モードを実装する方法:

1. コールバック関数

これは非同期の最も基本的なものです。プログラミング手法。

2 つの関数 f1 と f2 があり、後者は前者の実行結果を待つとします。

コードは次のとおりです。

f1();
f2();

f1 が時間のかかるタスクである場合は、f1 を書き換えて、f1 のコールバック関数として f2 を記述することを検討できます。

コードは次のとおりです:

  function f1(callback){
    setTimeout(function () {
      // f1的任务代码
      callback();
    }, 1000);
  }

実行コードは次のとおりです:

コードは次のとおりです:

  f1(f2);

このようにして、同期操作を非同期操作に変更します。F1 キーはプログラムの実行をブロックしません。これは、プログラムのメイン ロジックを最初に実行し、時間のかかる操作の実行を延期するのと同じです。

コールバック関数の利点は、シンプルで理解しやすく、デプロイしやすいことです。欠点は、コードの読み取りと保守に役立たないことです。さまざまな部分が高度に結合 (結合) されており、処理は非常に混乱し、各タスクはコールバック関数のみを指定できます。

2. イベント監視

もう 1 つの考え方は、イベント駆動型モデルを使用することです。タスクの実行はコードの順序ではなく、イベントが発生するかどうかによって決まります。

f1 と f2 を例に挙げてみましょう。まず、イベントを f1 にバインドします (ここでは jQuery を使用します)。

コードは次のとおりです:

  f1.on('done', f2);

上記のコード行は、done イベントが f1 で発生すると、f2 が実行されることを意味します。次に、f1 を書き換えます:

コードは次のとおりです:

  function f1(){
    setTimeout(function () {
      // f1的任务代码
      f1.trigger('done');
    }, 1000);
  }

f1.trigger('done') は、実行が完了すると、done イベントがすぐにトリガーされ、開始されることを意味します。 f2を実行します。

この方法の利点は、比較的理解しやすいこと、複数のイベントをバインドできること、各イベントに複数のコールバック関数を指定できること、「分離」(デカップリング)できるため、モジュール化が容易であることです。欠点は、プログラム全体をイベント駆動型にする必要があり、実行プロセスが非常に不明確になることです。

3. パブリッシュ/サブスクライブ

前のセクションの「イベント」は「シグナル」として理解できます。

「シグナル センター」があると仮定します。タスクが完了すると、シグナル センターにシグナルを「発行」します。他のタスクはシグナル センターに「サブスクライブ」できます。実行を開始できます。これは「パブリッシュ/サブスクライブ パターン」(パブリッシュ/サブスクライブ パターン) と呼ばれ、「オブザーバー パターン」(オブザーバー パターン) とも呼ばれます。

このパターンの実装は多数ありますが、次に示すのは、jQuery のプラグインである Ben Alman の Tiny Pub/Sub です。

まず、f2 は「Signal Center」jQuery からの「done」シグナルをサブスクライブします。

コードは次のとおりです:

  jQuery.subscribe("done", f2);

次に、f1 は次のように書き換えられます:

コードは次のとおりです:

  function f1(){
    setTimeout(function () {
      // f1的任务代码
      jQuery.publish("done");
    }, 1000);
  }

jQuery.publish( "done") は、f1 の実行が完了した後、"done" 信号が "シグナル センター" jQuery に解放され、それによって f2 の実行がトリガーされることを意味します。

また、f2 の実行完了後に購読を解除することもできます。

コードは次のとおりです:

  jQuery.unsubscribe("done", f2);

このメソッドの性質は「イベント リスニング」に似ていますが、明らかに後者よりも優れています。なぜなら、「メッセージ センター」を見て、存在するシグナルの数と各シグナルの加入者数を確認することで、プログラムの動作を監視できるからです。

4. Promises オブジェクト

Promises オブジェクトは、非同期プログラミング用の統一インターフェイスを提供するために CommonJS ワーキング グループによって提案された仕様です。

簡単に言えば、各非同期タスクが Promise オブジェクトを返し、そのオブジェクトにはコールバック関数を指定できる then メソッドがあるという考え方です。たとえば、f1 のコールバック関数 f2 は次のように記述できます:

コードは次のとおりです:

  f1().then(f2);

f1 は次のように書き換える必要があります (ここでは jQuery 実装が使用されています):

コードは次のとおりです:

  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 つのメソッドにはない利点があります。タスクが完了し、コールバック関数が追加された場合、コールバック関数がすぐに実行されます。そのため、イベントや信号を見逃すことを心配する必要はありません。この方法の欠点は、書くのも理解するのも比較的難しいことです。

関連する無料学習の推奨事項: JavaScript ビデオ チュートリアル

以上がJavaScript で非同期プログラミング パターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。