非同步 URL 取得:利用 Promise.all 提高效率
Promise.all 實用程式是並發執行序列的關鍵手段。開始取得 URL 陣列的任務時,我們的目標是獲得封裝對應文字內容的類似陣列。在深入研究這項努力之前,有必要對某些嘗試方法的缺點進行反思。
下面的程式碼片段在嘗試實現我們的目標時,未能達到目標:
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 函數既不返回數組也不傳回承諾,使其無效。其次,程式碼缺乏必要的嵌套來適當處理文本提取的非同步性質。
要修正這些缺點,需要採取多方面的方法。我們首先在 URL 陣列上呼叫 Promise.all,檢索代表各個獲取操作的 Promise 陣列。成功完成這些初始提取後,將使用第二次 Promise.all 呼叫從回應主體中擷取文字內容。然後將封裝的文字值聚合到一個內聚數組中。以下程式碼優雅地捕捉了這種方法的本質:
Promise.all(urls.map(u => fetch(u))).then(responses => Promise.all(responses.map(res => res.text())) ).then(texts => { // Proceed with texts array... })
此策略的簡化變體涉及在初始獲取承諾履行期間直接提取回應正文:
Promise.all(urls.map(url => fetch(url).then(resp => resp.text()) )).then(texts => { // Proceed with texts array... })
或者更簡潔地使用await:
const texts = await Promise.all(urls.map(async url => { const resp = await fetch(url); return resp.text(); }));
以上是Promise.all 如何簡化非同步 URL 取得以提高效率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!