Home > Web Front-end > JS Tutorial > How to Serialize Promises in a JavaScript ES6 For Loop?

How to Serialize Promises in a JavaScript ES6 For Loop?

Linda Hamilton
Release: 2024-11-27 19:44:19
Original
360 people have browsed it

How to Serialize Promises in a JavaScript ES6 For Loop?

JavaScript ES6 Promise For Loop Serialization

In the given code, you attempt to execute promises sequentially within a for loop but encounter a problem where the loop executes synchronously, resulting in unpredictable output.

Understanding the Issue:

A promise encapsulates an asynchronous operation, but the loop's synchronous nature triggers all promises simultaneously, disregarding the desired sequence.

Promisifying setTimeout:

To facilitate the sequential execution, we can promisify setTimeout to obtain a promise that resolves when the timer expires:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
Copy after login

Solution Options:

There are multiple ways to solve this problem, leveraging promises and asynchronous programming techniques.

1. For Loop with Initial Promise:

By starting with an immediately resolving promise, you can chain subsequent promises as the previous ones resolve:

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
  p = p
    .then(() => delay(Math.random() * 1000))
    .then(() => console.log(i));
}
Copy after login

2. Array.reduce with Initial Promise:

Using Array.reduce, you can create a chain of promises similar to the for loop approach:

[...Array(10)]
  .reduce(
    (p, _, i) =>
      p.then(() => delay(Math.random() * 1000))
        .then(() => console.log(i)),
    Promise.resolve()
  );
Copy after login

3. Function as Promise Resolution Callback:

You can define a function that passes itself as the resolution callback, allowing for a recursive promise chain:

const loop = (i) => {
  delay(Math.random() * 1000)
    .then(() => console.log(i))
    .then(() => {
      if (i < 10) loop(i + 1);
    });
};
loop(0);
Copy after login

4. async/await Syntax (ES2017):

ES2017 introduced async/await syntax to simplify asynchronous code handling:

const main = async () => {
  for (let i = 0; i < 10; i++) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
};
main();
Copy after login

5. for await...of Syntax (ES2020):

ES2020 introduced a special syntax for iterating over async iterables:

(async () => {
  for await (const i of [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
    await delay(Math.random() * 1000);
    console.log(i);
  }
})();
Copy after login

By utilizing these techniques, you can execute promises sequentially within a loop, ensuring the desired ordering of operations and avoiding unpredictable output.

The above is the detailed content of How to Serialize Promises in a JavaScript ES6 For Loop?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template