Home  >  Article  >  Web Front-end  >  How can Promise.all Streamline Asynchronous URL Fetching for Enhanced Efficiency?

How can Promise.all Streamline Asynchronous URL Fetching for Enhanced Efficiency?

DDD
DDDOriginal
2024-10-28 04:36:30338browse

How can Promise.all Streamline Asynchronous URL Fetching for Enhanced Efficiency?

Asynchronous URL Fetching: Leveraging Promise.all for Enhanced Efficiency

The Promise.all utility serves as a pivotal means for concurrently executing a sequence of asynchronous tasks. Embarking on the task of fetching an array of URLs, we aim to obtain an analogous array encapsulating the corresponding text content. Before delving into this endeavor, a moment's reflection upon the shortcomings of certain attempted approaches is warranted.

The snippet below, while attempting to accomplish our objective, falls short:

var promises = urls.map(url => fetch(url));
var texts = [];
Promise.all(promises)
  .then(results => {
     results.forEach(result => result.text()).then(t => texts.push(t))
  })

Firstly, this implementation is conceptually flawed, as the forEach function returns neither an array nor a promise, rendering it ineffective. Secondly, the code lacks the necessary nesting to appropriately handle the asynchronous nature of the text extraction.

To rectify these shortcomings, a multifaceted approach is required. We begin by invoking Promise.all on the array of URLs, retrieving an array of promises representing the individual fetch operations. Upon successful completion of these initial fetches, a second Promise.all invocation is employed to capture the text content from the response bodies. The encapsulated text values are then aggregated into a cohesive array. The essence of this approach is elegantly captured by the following code:

Promise.all(urls.map(u => fetch(u))).then(responses =>
    Promise.all(responses.map(res => res.text()))
).then(texts => {
    // Proceed with texts array...
})

A simplified variant of this strategy involves directly extracting the response body during the initial fetch promise fulfillment:

Promise.all(urls.map(url =>
    fetch(url).then(resp => resp.text())
)).then(texts => {
    // Proceed with texts array...
})

or even more concisely using await:

const texts = await Promise.all(urls.map(async url => {
  const resp = await fetch(url);
  return resp.text();
}));

The above is the detailed content of How can Promise.all Streamline Asynchronous URL Fetching for Enhanced Efficiency?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn