[解決済み] JavaScriptで、ループの中でawaitを使用するとループがブロックされるのですか?
2023-01-10 04:08:22
質問
次のようなループを考えてみましょう。
for(var i=0; i<100; ++i){
let result = await some_slow_async_function();
do_something_with_result();
}
-
は
await
はループをブロックしているのでしょうか?それともi
はインクリメントされ続け、その間await
になっているのでしょうか? -
の順序は正しいですか?
do_something_with_result()
に関して順次保証されているか?i
? それともawait
ed 関数が各i
?
どのように解決するのですか?
<ブロッククオート-
は
await
はループをブロックするのでしょうか?それともi
はインクリメントされ続け、その間await
になっているのでしょうか?
block"は適切な表現ではありませんが、そうです。
i
は待機中にインクリメントされ続けません。その代わり、実行は
async
関数が呼び出された場所にジャンプし、戻り値としてプロミスを提供し、関数呼び出しの後に続く残りのコードを、コードスタックが空になるまで継続します。そして、待ち受けが終わると、関数の状態が復元され、その関数内で実行が継続されます。その関数が戻る(完了する)たびに、先に返された対応する約束が解決されます。
- の順序は
do_something_with_result()
に関して順次保証されているか?i
? それともawait
ed 関数が各i
?
順番は保証されています。に続くコードは
await
に続くコードも、コールスタックが空になった後、つまり少なくとも次のマイクロタスクが実行できる時かその後にのみ実行されることが保証されます。
このスニペットで出力がどのようになっているかを見てください。特に、"after calling test"と書かれているところに注意してください。
async function test() {
for (let i = 0; i < 2; i++) {
console.log('Before await for ', i);
let result = await Promise.resolve(i);
console.log('After await. Value is ', result);
}
}
test().then(_ => console.log('After test() resolved'));
console.log('After calling test');
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] 文字列が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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] Node.jsのES6クラスをrequireで作る