차이점이 뭐야?
.then()
호출은 콜백에서 오류가 발생하는 경우에 거부됩니다 약속을 반환합니다. 즉, 성공에 logger
실패하면 오류가 다음 .catch()
콜백 으로 전달 fail
되지만와 함께 발생 하는 콜백 에는 전달 되지 않습니다 success
.
제어 흐름도 는 다음과 같습니다 .
동기 코드로 표시하려면 다음을 수행하십시오.
// 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);
}
두 번째 log
(첫 번째 인수와 같음 .then()
)는 예외가 발생하지 않은 경우에만 실행됩니다. 레이블이 붙은 블록과 break
문장은 약간 이상하게 느껴집니다. 실제로 파이썬이 가지고있는 것 try-except-else
입니다 (권장 독서!).
// some_promise_call().then(logger.log).catch(logger.log)
try {
var results = some_call();
logger.log(results);
} catch(e) {
logger.log(e);
}
catch
로거는 성공 로거 호출에서 예외를 처리합니다.
차이점이 너무 많습니다.
시도와 캐치에 대한 설명을 잘 이해하지 못합니다.
논쟁은 일반적으로 처리의 모든 단계에서 오류를 포착하고 체인에서 사용해서는 안된다는 것입니다. "antipattern"을 사용할 때 일부 콜백의 오류는 처리되지 않지만 모든 오류를 처리하는 최종 처리기는 하나만 있어야합니다.
그러나이 패턴은 실제로 매우 유용합니다. 정확하게이 단계에서 발생한 오류를 처리하고 오류가 발생하지 않은 경우 (예 : 오류를 복구 할 수없는 경우) 완전히 다른 작업을 수행하려는 경우. 이것이 제어 흐름을 분기 한다는 점에 유의 하십시오 . 물론 이것은 때때로 바람직하다.
다음과 관련하여 무엇이 문제입니까?
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);
});
.finally()
이것을 위해 사용 하는 것도 고려할 수 있습니다 .
then().catch()
쉼표를 찾을 필요가없고 성공 또는 실패 분기에 대한이 콜백을 조사 할 필요가 없으므로 더 읽기 쉽습니다.