Promise.all で複数の URL フェッチを克服する
非同期プログラミングの分野では、Promise はフェッチなどの非同期タスクを処理する強力なメカニズムを提供します。複数の URL からのデータ。あなたが遭遇したように、このユースケースを Promise.all パラダイムに当てはめようとすると、障害になる可能性があります。
試みた解決策を分析してみましょう:
var promises = urls.map(url => fetch(url)); var texts = []; Promise.all(promises) .then(results => { results.forEach(result => result.text()).then(t => texts.push(t)) })
このメソッドには問題があります。重大な欠陥: forEach は配列も Promise も返さないため、フェッチされたテキストにアクセスする方法がない Promise-void 状態になります。
これを修正するには、Promise.all を 2 回使用し、1 回目はテキストをフェッチする必要があります。 URL を取得し、応答からテキストを 1 回抽出します:
Promise.all(urls.map(u=>fetch(u))).then(responses => Promise.all(responses.map(res => res.text())) ).then(texts => { … })
または、フェッチとテキスト取得を 1 つのステップに組み合わせてプロセスを効率化できます:
Promise.all(urls.map(url => fetch(url).then(resp => resp.text()) )).then(texts => { … })
詳細簡潔な解決策として、async/await の機能を活用します。
const texts = await Promise.all(urls.map(async url => { const resp = await fetch(url); return resp.text(); }));
これらのアプローチにより、複数の URL フェッチを効率的に処理できるようになり、抽出されたテキストを含む目的のオブジェクトを構築できるようになります。
以上がPromise.all を使用して複数の URL から効率的にデータを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。