异步 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中文网其他相关文章!