Home >Web Front-end >JS Tutorial >How Can Promise.all Improve Concurrent Await Execution and Error Handling?

How Can Promise.all Improve Concurrent Await Execution and Error Handling?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-11 16:15:11814browse

How Can Promise.all Improve Concurrent Await Execution and Error Handling?

Concurrent Await Execution: Overcoming Sequential Execution

Issue:

In traditional asynchronous programming, concurrent execution of multiple await operations is obstructed due to sequential processing.

Cause:

The code in question waits for the first await operation to complete before initiating the second.

Proposed Solution:

The initial proposal of obtaining promises before awaiting them separately does allow parallel execution. However, it introduces issues with error handling and potential unhandled rejection errors.

Recommended Approach:

Instead of the proposed solution, we recommend utilizing Promise.all:

const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);

Benefits of Promise.all:

  • Initiates parallel execution of all provided promises.
  • Handles rejection properly, avoiding unhandled rejection errors.
  • Provides a more concise and consistent syntax compared to the proposed solution.

Example:

Consider the following example that demonstrates the difference in timing and error handling:

const getValue1Async = () => {
  return new Promise(resolve => {
    setTimeout(resolve, 500, "value1");
  });
};

const getValue2Async = () => {
  return new Promise((resolve, reject) => {
    setTimeout(reject, 100, "error");
  });
};

// Sequential execution with proposed solution
(async () => {
  try {
    console.time("sequential");
    const p1 = getValue1Async();
    const p2 = getValue2Async();
    const value1 = await p1;
    const value2 = await p2;
  } catch (e) {
    console.error(e);
  }
  console.timeEnd("sequential");
})();

// Concurrent execution with Promise.all
setTimeout(async () => {
  try {
    console.time("concurrent");
    const [value1, value2] = await Promise.all([getValue1Async(), getValue2Async()]);
  } catch (e) {
    console.timeEnd("concurrent", e);
  }
}, 1000);

In the sequential execution example, the code waits 500ms for the first operation to complete before initiating the second. In contrast, the concurrent execution example handles the failure of the second operation immediately after 100ms.

The above is the detailed content of How Can Promise.all Improve Concurrent Await Execution and Error Handling?. 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