js Promise同時制御メソッド

js Promise同時制御メソッド

質問

次のように、同時実行 Promise の数を制御するメソッドを記述する必要があります。

promiseConcurrencyLimit(制限、配列、iteratorFn)

limit は同時に実行されるプロミスの数、array はパラメータ配列、iteratorFn は各プロミスで実行される非同期操作です。

背景

開発では、通常は Promise.all を使用して、複数の Promise が処理された後に後処理ロジックを実行する必要があります。

プライム.all([p1, p2, p3]).then((res) => ...)

しかし、問題があります。promise は作成後すぐに実行されるため、つまり、promise.all に渡される複数の promise インスタンスは、作成時にすでに実行が開始されています。これらのインスタンスで実行される非同期操作がすべて http リクエストである場合、n 個の http リクエストが即座に発行されますが、これは明らかに不合理です。より合理的な方法は、Promise.all で実行される非同期操作の数を制限し、同時に実行できる非同期操作を limit 個だけにすることです。

アイデアと実装

背景で述べたように、Promise は作成後すぐに実行されるため、同時実行性を制御する核心は、Promise インスタンスの生成を制御することにあります。最初は、限られた数の Promise インスタンスのみが生成され、これらの Promise のステータスが変化するのを待ちます。いずれかの Promise インスタンスのステータスが変化すると、別の Promise インスタンスがすぐに作成されます... このサイクルは、すべての Promise が作成されて実行されるまで続きます。

npm には、この関数を実装するライブラリが多数あります。他のほとんどのライブラリが Promise を再実装するのに対し、tiny-async-pool ライブラリはネイティブ Promise を直接使用してこの関数を実装するため、個人的にはより優れていると思います。コアコードは次のとおりです。

非同期関数 asyncPool(poolLimit, 配列, iteratorFn) {
  const ret = []; // すべての Promise インスタンスを格納するために使用します const running = []; // 現在実行中の Promise を格納するために使用します
  for (配列のconst項目) {
    const p = Promise.resolve(iteratorFn(item)); // コールバック関数が promise 以外のものを返さないようにするには、Promise.resolve ret.push(p); でラップします。
    プール制限 <= 配列の長さの場合 {
      // then コールバックでは、promise ステータスが満たされると、実行中の promise リストからそれを削除します。executing const e = p.then(() => execute.splice(executing.indexOf(e), 1));
      実行中.push(e);
      実行中の長さ >= poolLimit の場合 {
        // 実行されるプロミス リストの数が制限に達したら、Promise.race を使用してプロミスの状態が変化するのを待ちます。
        // 状態が変化すると、then のコールバックが実行され、promise は実行から削除されます。
        // 次に次の for ループに入り、補足する新しい Promise を生成します。await Promise.race(executing);
      }
    }
  }
  Promise.all(ret) を返します。
}

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

定数タイムアウト = (i) => {
  コンソールにログ出力します。
  新しい Promise を返します ((resolve) => setTimeout(() => {
    解決する(i);
    コンソールにログ出力します。
  }、 私));
};

(非同期() => {
    const res = asyncPool(2, [1000, 5000, 3000, 2000], タイムアウトを待機します);
    コンソールログ(res);
  })();

コードの核となる考え方は次のとおりです。

  • まず、limit promiseインスタンスを初期化し、実行配列に格納します。
  • Promise.raceを使用して、これらの制限プロミスインスタンスの実行結果を待機します。
  • プロミスの状態が変化すると、そのプロミスは実行から削除され、その後ループが実行されて新しいプロミスが生成され、実行状態になります。
  • すべての Promise が実行されるまで、手順 2 と 3 を繰り返します。
  • 最後に、Promise.allを使用して、すべてのPromiseインスタンスの実行結果を返します。

js Promise の同時呼び出し数を制御する方法についての記事はこれで終わりです。js Promise の同時呼び出し制御に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript における Promise の詳細な説明
  • フロントエンドJavaScriptの約束
  • JavaScriptはPromiseを使用して複数の繰り返しリクエストを処理します
  • JS非同期プログラミングの深い理解 - Promise
  • JavaScript Promise の徹底解説

<<:  mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します

>>:  Ubuntu 18.04 のログインループ/ブートインターフェイスで停止/グラフィカルインターフェイスに入ることができない問題を解決する方法

推薦する

Mysqlアカウント管理の原理と実装方法の詳細な説明

この記事では、例を使用して、MySQL アカウント管理の原則と実装方法を説明します。ご参考までに、詳...

MySQL データベースの高度なクエリとマルチテーブルクエリ

MySQL マルチテーブルクエリワークシートを追加する -- ユーザーテーブル (ユーザー) テーブ...

JavaScriptは行削除機能を備えたテーブルを動的に生成します

この記事の例では、テーブルを動的に生成したり行を削除したりするためのJavaScriptの具体的なコ...

Vueフィルターの使い方

目次概要フィルターの定義フィルターの使用カスタムグローバルフィルターローカルフィルター予防例1(ロー...

Vueは画像のズームとドラッグをサポートするリッチテキストエディタを統合しています

必要:ビジネス要件によると、写真をアップロードできる必要があり、アップロードされた写真はモバイル端末...

ネイティブJSを使用した遅延読み込みlazyLoadの3つの方法の概要

目次序文方法1: 高コントラスト方法2: getBoundingClientRect() APIを使...

標準的なHTMLの書き方は、Dreamweaverによって自動的に生成されるものとは異なります。

コードをコピーコードは次のとおりです。 <!--doctype はドキュメント タイプ htm...

Vue プロジェクトでよく使用されるツール機能の概要

目次序文1. カスタムフォーカスコマンド1. 方法1 2. 方法2 3. 方法3 2. 入力ボックス...

Linux での感嘆符コマンド (!) の使用の概要

序文最近、弊社では mbp の設定をしており、ssh を使うことが多くなりました。複雑なコマンドを書...

nginx + セカンダリドメイン名 + https サポートを使用する

ステップ1: Alibaba Cloudプライマリドメイン名にセカンダリドメイン名を追加する2 番目...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

mysqlとnavicat間の接続を確立する際の1251エラーを解決する

コンピュータを再インストールし、最新バージョンのMySQLデータベースをインストールしました。その結...

レスポンシブフレームワークのテーブルヘッダーの自動改行問題に対する簡単な解決策

最近、Bootstrap を使って Web サイトを開発しています。表を処理していたところ、PC で...

MySql で正規表現クエリを使用する方法

正規表現は、特定のパターンに一致するテキストを検索および置換するためによく使用されます。たとえば、テ...

mysql+mycat、負荷分散、マスタースレーブレプリケーション、読み取り/書き込み分離操作に基づく安定した高可用性クラスタを構築します。

データベースのパフォーマンス最適化には、一般的にクラスタリングが採用されています。Oracle クラ...