質問次のように、同時実行 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); })(); コードの核となる考え方は次のとおりです。
js Promise の同時呼び出し数を制御する方法についての記事はこれで終わりです。js Promise の同時呼び出し制御に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: mysql ルートユーザーを認証できず、Navicat リモート認証プロンプト 1044 の問題を解決します
>>: Ubuntu 18.04 のログインループ/ブートインターフェイスで停止/グラフィカルインターフェイスに入ることができない問題を解決する方法
現在の日付 + 時刻 (日付 + 時刻) を取得する関数: now() mysql> now(...
目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...
1. v-forでは常に:keyを使用するデータを操作する必要があるときにプログラムを一定かつ予測可...
序文lvm (論理ボリューム マネージャー) 論理ボリューム管理は、Linux システムのニーズを満...
Fast-Linux プロジェクト アドレス: https://gitee.com/uitc/Fas...
バックエンド管理システムで作業している場合、通常、メニュー権限制御に関連する問題に遭遇します。もちろ...
この記事では、MySqlのインストールとアンインストールのチュートリアルを参考までに紹介します。具体...
1. シェルスクリプトを作成する vim バックアップdb.sh 次のようにスクリプトを作成します。...
現在、CentOS の最新バージョンは CentOS 8 です。次に、CentOS Linux 8....
この記事では、スライディングカルーセル効果を実現するためのjsの具体的なコードを参考までに共有します...
目次posgresql バックアップ/リストアMySQL バックアップ/復元posgresql バッ...
親ディレクトリを指定する方法../ はソース ファイルの親ディレクトリを表し、../../ はソース...
目次序文Axiosのインストールと設定シンプルなGETリクエストを開始するPOSTリクエストを行うシ...
1. インストールディレクトリにzipパッケージを解凍します。まず、mysql-8.0.11-win...
...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...