> 웹 프론트엔드 > JS 튜토리얼 > Promise.allSettled()가 필요합니까?

Promise.allSettled()가 필요합니까?

DDD
풀어 주다: 2024-11-30 16:47:14
원래의
768명이 탐색했습니다.

Do we need Promise.allSettled()?

Promise.allSettled()에 대해 어떻게 생각하시나요?

저에게 allSettled는 문제를 찾는 솔루션처럼 보입니다. 문제는 개발자가 오류를 처리하지 않는다는 것입니다.

개념

Promise.allSettled()는 매우 단순한 디자인을 가지고 있습니다.

const allSettled = (promises) => Promise.all(promises.map(entry => entry
  .then((value) => ({ status: 'fulfilled', value }))
  .catch((reason) => ({ status: 'rejected', reason }))
));
로그인 후 복사

"일관된" 결과 개체를 제공합니다. 상태는 일관되므로 Object.hasOwn()을 사용하는 것보다 더 깔끔하게 .filter()를 사용할 수 있지만 값과 이유는 의도적으로 다르기 때문에 혼동할 수 없습니다.

대부분 allSettled는 각 약속에 .catch()를 추가합니다.

오류 처리

하지만 여기에 내 문제가 있습니다. 여러 서비스 그룹을 병렬로 호출하고 하나 이상의 서비스가 실패할 수 있다는 것을 알고 있지만 별 문제가 되지 않는 경우... 이에 대한 오류 처리를 작성하지 않는 이유는 무엇입니까?

const getFlakyService = (payload) => fetch(flakyUrl, payload);

Promise.allSettled([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((outcomes) => outcomes
  .filter(({ status }) => status === 'fulfilled'))
});
로그인 후 복사

이것에 비해 얼마나 많은 노력을 절약하고 있는지:

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // We don't really care about the failures
  .catch(() => undefined);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
로그인 후 복사

어떤 호출이 실패하는지 걱정된다면 추적을 위해 액세스할 수 있는 요청 정보가 필요할 수 있지만 그 이유로 인해 사용 가능 여부가 보장되지는 않습니다. 이 경우 Promise.allSettled는 훨씬 덜 유용하며 오류 처리를 직접 작성하는 것이 더 합리적입니다.

const getFlakyService = (payload) => fetch(flakyUrl, payload)
  // Send the failures details to a tracking/logging layer
  .catch((error) => trackRequestError(flakyUrl, payload, error);

Promise.all([
  getFlakyService({ type: 'reptiles' }),
  getFlakyService({ type: 'mammals' }),
  getFlakyService({ type: 'birds' }),
  getFlakyService({ type: 'amphibians' }),
]).then((data) => { /* ... */ });
로그인 후 복사

'결과'의 표준화가 편리할 수 있다는 점은 인정하겠습니다. allSettled를 사용하면 모두 완료된 후 실패 횟수를 계산할 수 있습니다. 하지만 이는 사용자 정의 오류 처리에서도 마찬가지입니다.

결론

가까운 미래에도 Promise.all()을 계속 사용할 예정이지만 Promise.allSettled() 사용 사례와 이를 선호하는 이유에 대해 듣고 싶습니다.

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

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿