[解決済み] たくさんのPromiseを返して、他のことをする前に全部待つ方法
2022-10-10 18:50:39
質問
非同期に何かを行うメソッドを呼び出すループがあります。このループはメソッドを何度も呼び出すことができます。このループの後に、すべての非同期的なものが完了したときにのみ実行される必要がある別のループを持っています。
これは私が欲しいものを示しています。
for (i = 0; i < 5; i++) {
doSomeAsyncStuff();
}
for (i = 0; i < 5; i++) {
doSomeStuffOnlyWhenTheAsyncStuffIsFinish();
}
私はプロミスにあまり詳しくないので、どなたかこれを実現するために助けていただけませんか?
これは私の
doSomeAsyncStuff()
はどのように振る舞うのでしょうか。
function doSomeAsyncStuff() {
var editor = generateCKEditor();
editor.on('instanceReady', function(evt) {
doSomeStuff();
// There should be the resolve() of the promises I think.
})
}
こんな感じでいいのかも。
function doSomeAsyncStuff() {
var editor = generateCKEditor();
return new Promise(function(resolve,refuse) {
editor.on('instanceReady', function(evt) {
doSomeStuff();
resolve(true);
});
});
}
でも、構文がよくわからない。
どのように解決するのですか?
この場合
Promise.all
(
スペック
,
MDN
) を使うことができます。それは個々の約束の束を受け入れ、あなたが与えた約束のすべてが解決されたときに解決され、それらのいずれかが拒否されたときに拒否される単一の約束をあなたに返します。
ですから、もしあなたが
doSomeAsyncStuff
はプロミスを返すとします。
const promises = [];
// ^^^^^−−−−−−−−−−−−−−−−−−−−−−−−−−− use `const` or `let`, not `var`
for (let i = 0; i < 5; i++) {
// ^^^−−−−−−−−−−−−−−−−−−−−−−−− added missing declaration
promises.push(doSomeAsyncStuff());
}
Promise.all(promises)
.then(() => {
for (let i = 0; i < 5; i++) {
// ^^^−−−−−−−−−−−−−−−− added missing declaration
doSomeStuffOnlyWhenTheAsyncStuffIsFinish();
}
})
.catch((e) => {
// handle errors here
});
MDNにはプロミスに関する記事があります はこちら . また、私の本の第8章では、プロミスを詳しく取り上げています。 JavaScriptで詳しく説明しています。新しいおもちゃ もし興味があれば、私のプロフィールにリンクがあります。
これはその一例です。
function doSomethingAsync(value) {
return new Promise((resolve) => {
setTimeout(() => {
console.log("Resolving " + value);
resolve(value);
}, Math.floor(Math.random() * 1000));
});
}
function test() {
const promises = [];
for (let i = 0; i < 5; ++i) {
promises.push(doSomethingAsync(i));
}
Promise.all(promises)
.then((results) => {
console.log("All done", results);
})
.catch((e) => {
// Handle errors here
});
}
test();
出力例(出力に
Math.random
があるため、最初に終わるものは異なる場合があります)。
3を解決する 2を解決する 1を解決する リゾルブ4 0を解決する すべて完了[0,1,2,3,4]。
関連
-
[解決済み] JavaScript の Promise が解決するのを待ってから機能を再開するにはどうすればよいですか?
-
[解決済み] Promise.allのエラー処理
-
[解決済み】Pythonで非同期メソッド呼び出し?
-
[解決済み】一部の約束が拒否されても、すべての約束が完了するまで待つ
-
[解決済み] 関数の変数を返す前に、プロミスが終了するのを待つには?
-
[解決済み] JSのDateからDay名
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JSHintの'+'前の改行不良の説明
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?