[解決済み] forEachループでasync/awaitを使用する
2022-03-18 20:30:55
質問
を使用することに問題はないのでしょうか?
async
/
await
で
forEach
ループ?ファイルの配列をループさせようとしていて
await
を各ファイルのコンテンツに適用してください。
import fs from 'fs-promise'
async function printFiles () {
const files = await getFilePaths() // Assume this works fine
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
})
}
printFiles()
このコードは動作するのですが、何か問題があるのでしょうか?私はある人から、「このコードでは
async
/
await
をこのような高次の関数で使用した場合、何か問題があるのかどうかをお聞きしたかったのです。
どのように解決するのですか?
確かにこのコードは動作しますが、あなたが期待するような動作をしていないことは確かです。これは複数の非同期呼び出しを行うだけですが、その際に
printFiles
関数は、その後すぐに戻ってきます。
順番に読む
ファイルを順番に読みたい場合。
を使用することはできません。
forEach
確かに ただ、現代的な
for … of
ループを使用し、その中で
await
は期待通りに動作します。
async function printFiles () {
const files = await getFilePaths();
for (const file of files) {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
}
}
並行読み
ファイルを並行して読みたい場合。
を使用することはできません。
forEach
確かに それぞれの
async
コールバック関数の呼び出しはプロミスを返しますが、あなたはそれを待つのではなく、捨てているのです。ただ
map
で得られる約束の配列を待つことができます。
Promise.all
:
async function printFiles () {
const files = await getFilePaths();
await Promise.all(files.map(async (file) => {
const contents = await fs.readFile(file, 'utf8')
console.log(contents)
}));
}
関連
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] 非同期アロー関数のシンタックス
-
[解決済み] 非同期関数+await+setTimeoutの組合せ
-
[解決済み】Array.mapで非同期awaitを使用する。
最新
-
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クロスドメインソリューション リアクト構成 リバースプロキシ
-
fetch ネットワークリクエストラッパーの説明例
-
JSアレイループと効率解析の比較
-
HTML+CSS+JavaScriptで簡単な三目並べゲームを作成する。
-
vue ディレクティブ v-html と v-text
-
Vueのクラススタイルの使い方の詳細
-
[解決済み】TypeScript-のAngular Frameworkエラー - "exportAsがngFormに設定されたディレクティブはありません"
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR