>웹 프론트엔드 >JS 튜토리얼 >Promise에서 `.then(success, failure)`를 안티패턴으로 사용하는 경우는 언제입니까?

Promise에서 `.then(success, failure)`를 안티패턴으로 사용하는 경우는 언제입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-28 18:36:13860검색

When is Using `.then(success, fail)` an Antipattern in Promises?

.then(success, failure): 언제 Promise에 대한 안티패턴으로 간주됩니까?

Bluebird Promise FAQ에서 .then(success, failure)가 플래그로 지정되어 있습니다. 안티패턴으로. 특히 try 및 catch 문에 대한 설명을 이해하지 못하는 경우 혼란스러울 수 있습니다.

.then(success, failure)의 문제는 무엇입니까?

.then() 호출 콜백에서 오류가 발생하면 거부하는 Promise를 반환합니다. 즉, 성공 로거가 실패하면 오류는 성공에 따른 실패 콜백이 아닌 다음 .catch() 콜백으로 전달됩니다.

제어 흐름 다이어그램

.then에 대한 제어 흐름 두 개의 인수와 .then-catch 체인이 있는 경우는 아래 그림과 같습니다.

[.then 및 .then-catch 체인에 대한 제어 흐름 다이어그램 이미지 .then-catch 체인]

동기 코드 동일

이를 동기 코드로 표현하려면:

// some_promise_call().then(logger.log, logger.log)
then: {
    try {
        var results = some_call();
    } catch(e) {
        logger.log(e);
        break then;
    } // else
        logger.log(results);
}

.then(success) 대 .then().catch ()

비교해보세요 with:

// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}

이 경우 catch 로거는 성공 로거 호출의 예외를 처리합니다.

언제 .then(success, failure)가 안티패턴인가요?

이 패턴에 반대하는 주장은 일반적으로 모든 처리 단계에서 오류를 포착하고 이를 체인에서 사용하지 않아야 한다는 것입니다. 모든 오류에 대해 하나의 최종 핸들러만 있을 것으로 예상됩니다.

그러나 이 패턴은 특정 단계에서 특정 오류를 처리하고 오류가 발생하지 않는 경우 다른 조치를 취할 때 유용합니다. 이는 제어 흐름을 분기한다는 점에 유의하세요.

향상된 안티패턴 예

다음을 고려하세요.

some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });

또는 이 목적으로 .finally()를 사용할 수도 있습니다.

위 내용은 Promise에서 `.then(success, failure)`를 안티패턴으로 사용하는 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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