[解決済み] ES6のPromise.all()を使用する際に、並行処理を制限する最善の方法は何でしょうか?
2022-05-05 22:38:47
質問
私は、データベースから照会されたリストを反復し、そのリストの各要素に対してHTTPリクエストを行ういくつかのコードを持っています。 このリストは、時にはそれなりに大きな数(数千)になることがあり、私は何千もの同時HTTPリクエストでWebサーバーをヒットしないことを確認したいと思います。
このコードの省略版は、現在次のようなものです。
function getCounts() {
return users.map(user => {
return new Promise(resolve => {
remoteServer.getCount(user) // makes an HTTP request
.then(() => {
/* snip */
resolve();
});
});
});
}
Promise.all(getCounts()).then(() => { /* snip */});
このコードはNode 4.3.2上で動作しています。 もう一度言いますが
Promise.all
は、常に一定の数の Promise が進行中であるように管理されるのですか?
どのように解決するのですか?
注意点
Promise.all()
はプロミスが作業を開始するきっかけにはなりませんが、プロミスそのものを作成することはできます。
それを考えると、一つの解決策は、プロミスが解決されるたびに、新しいプロミスを開始すべきか、すでに限界に達しているかをチェックすることでしょう。
しかし、ここで車輪を再発明する必要はないでしょう。
この目的に使用できるライブラリの1つが
es6-promise-pool
. その例から。
// On the Web, leave out this line and use the script tag above instead.
var PromisePool = require('es6-promise-pool')
var promiseProducer = function () {
// Your code goes here.
// If there is work left to be done, return the next work item as a promise.
// Otherwise, return null to indicate that all promises have been created.
// Scroll down for an example.
}
// The number of promises to process simultaneously.
var concurrency = 3
// Create a pool.
var pool = new PromisePool(promiseProducer, concurrency)
// Start the pool.
var poolPromise = pool.start()
// Wait for the pool to settle.
poolPromise.then(function () {
console.log('All promises fulfilled')
}, function (error) {
console.log('Some promise rejected: ' + error.message)
})
関連
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] モバイル端末の検出にはどのような方法がありますか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] jQueryでJavaScriptオブジェクトから選択する際に、オプションを追加する最も良い方法は何ですか?
-
[解決済み] JavaScriptで「タッチパネル」デバイスを検出する最適な方法とは?
-
[解決済み】JavaScriptのDateを0時に初期化する最適な方法は何ですか?
-
[解決済み】ES6 WeakMapの実際の使い道は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
要素ツリー制御によるvueTreeテーブル
-
元のイベントが実行されなかった後に要素を追加するためのjQueryソリューション
-
vueディレクティブv-bindの使用と注意点
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】React Nativeアプリをターミナルから実行するとエラーが発生する(iOS)
-
[解決済み】(Google Map API) Geocodeは以下の理由で成功しませんでした。REQUEST_DENIED
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
[解決済み] 明示的なプロミス構築のアンチパターンとそれを回避する方法とは?
-
[解決済み】Node.jsネイティブのPromise.allは並列処理か逐次処理か?