차이점이 뭐야?
.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()쉼표를 찾을 필요가없고 성공 또는 실패 분기에 대한이 콜백을 조사 할 필요가 없으므로 더 읽기 쉽습니다.