>웹 프론트엔드 >JS 튜토리얼 >JavaScript ES6 For 루프에서 약속을 직렬화하는 방법은 무엇입니까?

JavaScript ES6 For 루프에서 약속을 직렬화하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-27 19:44:19299검색

How to Serialize Promises in a JavaScript ES6 For Loop?

JavaScript ES6 Promise For Loop Serialization

주어진 코드에서 for 루프 내에서 Promise를 순차적으로 실행하려고 시도했지만 문제가 발생했습니다. 루프가 동기적으로 실행되어 예측할 수 없는 결과가 발생합니다. 출력.

문제 이해:

Promise는 비동기 작업을 캡슐화하지만 루프의 동기 특성은 원하는 순서를 무시하고 모든 Promise를 동시에 트리거합니다.

약속하다 setTimeout:

순차 실행을 용이하게 하기 위해 타이머가 만료될 때 해결되는 약속을 얻도록 setTimeout을 약속할 수 있습니다.

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

해결책 옵션:

Promise와 비동기 프로그래밍을 활용하여 이 문제를 해결하는 방법은 여러 가지가 있습니다. 기술.

1. 초기 Promise가 있는 For 루프:

즉시 해결되는 Promise로 시작하여 이전 Promise가 해결되는 대로 후속 Promise를 연결할 수 있습니다.

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

2. 초기 약속이 포함된 Array.reduce:

Array.reduce를 사용하면 for 루프 접근 방식과 유사한 Promise 체인을 만들 수 있습니다.

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

3. 약속 해결 콜백으로서의 함수:

자신을 해결 콜백으로 전달하는 함수를 정의하여 재귀적 약속 체인을 허용할 수 있습니다:

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

4. async/await 구문(ES2017):

ES2017에서는 비동기 코드 처리를 단순화하기 위해 async/await 구문을 도입했습니다.

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

5. for wait...of 구문(ES2020):

ES2020은 비동기 반복 가능 항목을 반복하기 위한 특수 구문을 도입했습니다.

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

이러한 기술을 활용하면 Promise를 순차적으로 실행할 수 있습니다. 루프 내에서 원하는 작업 순서를 보장하고 예측할 수 없는 출력을 방지합니다.

위 내용은 JavaScript ES6 For 루프에서 약속을 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.