source

그렇다면 (성공, 실패)는 언제 약속의 반대가 되는가?

manysource 2022. 12. 13. 20:13

그렇다면 (성공, 실패)는 언제 약속의 반대가 되는가?

나는 블루버드 약속 FAQ를 봤는데, 거기에는 그것이 반향이라고 나와 있다.나는 그 설명에 대해 잘 이해하지 못한다.try ★★★★★★★★★★★★★★★★★」catch음음음음 음음음?

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

이 예에서는 다음과 같은 올바른 방법을 제시하고 있는 것 같습니다.

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

뭐가 다른데?

뭐가 다른데?

.then()콜백에 의해 에러가 발생했을 경우 거부되는 약속이 반환됩니다.했을 때, 「」는 「」의 의미입니다.logger됩니다..catch()단, 콜백, , 콜백,fail''에 'success.

다음으로 제어 흐름도를 나타냅니다.

2개의 인수를 사용하여 그때의 흐름도를 제어합니다. 당시 캐치 체인 제어 흐름도

동기 코드로 표현하려면:

// 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);
}

번째 두 the thelog 논거와 ).then()하지 않은 는 예외가 발생하지 않은 경우에만 실행됩니다.이 붙은 과 " " " " "breakpython이 가지고 있는 은, 문장이 조금 이상하다고 느껴집니다(권장 읽기!).

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

catch callsuccess logger의 합니다.

그 차이에 대해서는 이쯤 해두자.

트라이 앤 캐치에 대한 설명은 잘 모르겠습니다.

이 주장은 보통 처리의 모든 단계에서 오류를 포착하고 체인으로 사용하지 않아야 한다는 것입니다.모든 오류를 처리하는 최종 핸들러는 1개뿐입니다.단, "안티패턴"을 사용하면 콜백 중 일부 오류는 처리되지 않습니다.

단, 이 패턴은 실제로 매우 유용합니다.정확히 이 단계에서 발생한 오류를 처리하고 오류가 발생하지 않았을 때(, 오류를 복구할 수 없는 경우) 완전히 다른 작업을 수행할 수 있습니다.이것이 제어 흐름을 분기시키고 있다는 점에 유의하십시오.물론, 이것은 때때로 바람직하다.


다음에 뭐가 문제죠?

some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })

콜백을 반복해야 한다고요너는 오히려 원한다.

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

이 경우에도 를 사용하는 것이 좋습니다.

을 사용하다 점은 첫는 '예외 '예외'가 '예외'가 '예외'가 아니라 ''가 '예외'가 '예외'가 '예외'가 '예외'가 아닌 '예외'가 '예외'가'라는 거죠.success이 해결된해야 하는 이지만, 반드시 반환해야 하는 경우에는 후행적인 것이 합니다.catch 다른 핸들러)thensuccess파라미터)를 참조해 주세요.,의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.then실패할 이 있는 이의 2-파라미터가 됩니다.2번으로 하다then괜찮을지도 몰라

은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아!then의 묶음을 하는 기능에 하여 대부분 이 됩니다.이 기능을 의 'Da'가 .실제로 이 작업을 실시했을 경우, 2 파라미터의 형식은then위의 이유로 미묘하게 동작하지 않습니다.중간 사슬을 사용하면 특히 직관에 반합니다.

복잡한 비동기 작업을 많이 해 본 사람으로서 이 안티패턴을 피하고 개별 핸들러 접근 방식을 택할 것을 권장합니다.

양쪽의 장점과 단점을 살펴봄으로써 우리는 어떤 것이 상황에 적합한지 계산된 추측을 할 수 있다.이것은 약속을 이행하기 위한 두 가지 주요 접근법입니다.둘 다 장단점이 있다

캐치 어프로치

some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })

이점

  1. 모든 오류는 하나의 캐치 블록으로 처리됩니다.
  2. 그 후 블록에서 예외도 포착합니다.
  3. 복수의 성공 콜백 체인

단점들

  1. 체인의 경우는, 다른 에러 메세지를 표시하기 어려워집니다.

성공/오류 접근법

some_promise_call()
.then(function success(res) { logger.log(res) },
      function error(err) { logger.log(err) })

이점

  1. 미세한 오류 제어가 이루어집니다.
  2. db error, 500 error 등 다양한 카테고리의 에러에 대해 공통 에러 처리 기능을 사용할 수 있습니다.

디파티지

  1. 한 번 더 예요.catch

간단한 설명:

ES2018년

인수 onRejected를 사용하여 캐치 메서드를 호출하면 다음 절차가 수행됩니다.

  1. 약속을 이 가치로 합시다.
  2. 반품?호출(약속, "then", "defined, onRejected").

즉, 다음과 같습니다.

promise.then(f1).catch(f2)

동등.

promise.then(f1).then(undefiend, f2)

「」를 사용합니다..then().catch()를 사용하면 워크플로우를 수행하는 데 필요한 Promise Chaining을 활성화할 수 있습니다.데이터베이스에서 정보를 읽어 비동기 API에 전달하고 응답을 조작해야 할 수 있습니다.응답을 데이터베이스로 다시 푸시할 수 있습니다.이러한 모든 워크플로우를 고객님의 개념으로 처리하는 것은 가능하지만 관리가 매우 어렵습니다.더 나은 해결책은then().then().then().then().catch()한 번에 모든 오류를 수신하여 코드 유지보수를 유지할 수 있습니다.

「」를 사용합니다.then() ★★★★★★★★★★★★★★★★★」catch()성공과 실패의 연속 핸들러를 지원합니다.catch()반환된 약속에 따른 작품then() 처리된다.

  1. 만약 약속이 거절당했다면.사진의 #3을 참조
  2. 의 성공 핸들러에서 에러가 발생했을 경우는, 다음의 행 번호 4 ~7 의 사이에 있습니다.#2 를 참조해 주세요( 「 2. a 」 の 「 Failure 」 ( 「 」2 . a ) 。then()을 참조해 주세요.
  3. 의 장애 핸들러에서 에러가 발생했을 경우는, 다음의 행 8 을 참조해 주세요.사진의 3.b를 참조해 주세요.

1. let promiseRef: Promise = this. aTimetakingTask (false); 2. promiseRef 3. .then( 4. (result) => { 5. /* successfully, resolved promise. 6. Work on data here */ 7. }, 8. (error) => console.log(error) 9. ) 10. .catch( (e) => { 11. /* successfully, resolved promise. 12. Work on data here */ 13. });

여기에 이미지 설명 입력

주의: 대부분의 경우 다음과 같은 경우 장애 핸들러가 정의되지 않을 수 있습니다.catch() 이: edit edit edit reject()catch()가 「」에 있는 만.then()정의되어 있지 않습니다.그림에서 3번 주의:catch()8행과 9행의 핸들러가 정의되어 있지 않은 경우에 호출됩니다.

약속입니다.then()콜백이 처리 중인 경우 에러는 발생하지 않습니다.

말 대신 좋은 예시가 되겠습니다.다음 코드(첫 번째 약속이 해결된 경우):

Promise.resolve()
.then
(
  () => { throw new Error('Error occurs'); },
  err => console.log('This error is caught:', err)
);

다음 항목과 동일합니다.

Promise.resolve()
.catch
(
  err => console.log('This error is caught:', err)
)
.then
(
  () => { throw new Error('Error occurs'); }
)

그러나 첫 번째 약속을 거부한 경우, 이는 동일하지 않습니다.

Promise.reject()
.then
(
  () => { throw new Error('Error occurs'); },
  err => console.log('This error is caught:', err)
);

Promise.reject()
.catch
(
  err => console.log('This error is caught:', err)
)
.then
(
  () => { throw new Error('Error occurs'); }
)

언급URL : https://stackoverflow.com/questions/24662289/when-is-thensuccess-fail-considered-an-antipattern-for-promises