Promise.allでURLの配列を取得するにはどうすればよいですか?
2023-09-02 12:14:35
質問
私はURLの配列を持っている場合。
var urls = ['1.txt', '2.txt', '3.txt']; // these text files contain "one", "two", "three", respectively.
そして、このようなオブジェクトを作りたいのです。
var text = ['one', 'two', 'three'];
で覚えるようにしています。
fetch
を返しますが、これはもちろん
Promise
s.
私が試したことのあるいくつかの はしません。 は動作しません。
var promises = urls.map(url => fetch(url));
var texts = [];
Promise.all(promises)
.then(results => {
results.forEach(result => result.text()).then(t => texts.push(t))
})
これは正しく見えませんし、いずれにしても動作しません。配列 ['one', 'two', 'three'] にはなりません。
を使うことはできますか?
Promise.all
を使うのが正しい方法なのでしょうか?
どのように解決するのですか?
はい。
Promise.all
は正しいアプローチですが、実際には2回必要で、もし最初に
fetch
を取得し、次にすべての
text
を取得します (これもまた、レスポンスのボディのための約束です)。ですから、あなたは次のようにする必要があります。
Promise.all(urls.map(u=>fetch(u))).then(responses =>
Promise.all(responses.map(res => res.text()))
).then(texts => {
…
})
現在のコードが動作していないのは
forEach
は何も返しません(配列もプロミスも)。
もちろん、これを単純化して、それぞれのフェッチプロミスが成就した直後に、それぞれのレスポンスからボディを取得することから始めることも可能です。
Promise.all(urls.map(url =>
fetch(url).then(resp => resp.text())
)).then(texts => {
…
})
または同じものを
await
:
const texts = await Promise.all(urls.map(async url => {
const resp = await fetch(url);
return resp.text();
}));
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み】配列に何かを追加する方法は?
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
最新
-
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です。.forEach()と.map()の違いについて
-
[解決済み] .json()はなぜプロミスを返すのですか?
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] moment.jsでミュータビリティを回避するには?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] 変異を伴わないオブジェクトからの値の削除