>웹 프론트엔드 >JS 튜토리얼 >Promise.all()의 폴리필

Promise.all()의 폴리필

Linda Hamilton
Linda Hamilton원래의
2024-10-22 20:43:02446검색

Polyfills of Promise.all()

Promise.all()의 기능

입력 : Promise 배열 필요(필요하지 않음)
출력: 모든 성공 약속의 결과 배열이 포함된 Promise를 반환합니다.
참고: 약속이 실패하면 즉시 거부됩니다.

Promise.myAll()에 대한 코드

`
Promise.myAll = 함수(약속) {
return new Promise(함수 (해결, 거부) {
// 입력이 배열인지 확인
if (!Array.isArray(약속)) {
return accept(new TypeError("인자는 배열이어야 합니다."));
}

let results = [];
let completedPromises = 0;

promises.forEach(function (promise, index) {
  // Use Promise.resolve to handle non-promise values
  Promise.resolve(promise)
    .then(function (value) {
      results[index] = value;
      completedPromises += 1;

      // If all promises are resolved
      if (completedPromises === promises.length) {
        resolve(results);
      }
    })
    .catch(function (error) {
      reject(error); // Reject if any promise fails
    });
});

// Handle case with empty array of promises
if (promises.length === 0) {
  resolve([]);
}

});
};
`

1. 모든 Promise가 성공적으로 해결된 경우

. 모든 Promise가 해결되고 그 결과는 결과 배열에 저장됩니다.
. 해결된 Promise의 수가 입력 배열의 길이와 같을 때 외부 Promise는 결과 배열로 해결됩니다.

2. Promise.resolve()를 사용하는 이유

. Promise 배열에서 모든 값이 Promise여야 할 필요는 없으며 숫자, 문자열 또는 동기 함수 등 어떤 값으로도 가능합니다.

  1. 전달된 값이 이미 Promise인 경우 - 추가 래핑이나 변경이 발생하지 않도록 동일한 Promise를 반환합니다.

  2. 전달된 값이 Promise가 아닌 경우 - 해결된 Promise로 값을 래핑하여 Promise처럼 처리하고 .then()으로 처리할 수 있습니다.

3. 왜 Promise.resolve()를 사용하고 Promise.reject()는 사용하지 않는가?

값으로 해결되도록 거부를 사용하면 오류로 간주되는 값과 함께 catch 블록에 포착됩니다.

4. Promise가 실패하면 어떻게 되나요?

  1. 이렇게 하면 Promise.myAll()이 즉시 거부되도록 하는 외부 약속의 거부() 호출이 트리거됩니다.
  2. 동기 프로그램이므로 foreach 루프는 계속됩니다
  3. Promise의 나머지 부분은 해결되고 해당 값이 결과에 추가되지만 CompletedPromise!=promises.length로 해결되지 않으며 계속 시도하면 Promise.myAll()이 현재 보류 상태가 아니기 때문에 무시됩니다.

궁금한 점은 댓글로 남겨주세요!

위 내용은 Promise.all()의 폴리필의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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