그렇다면 (성공, 실패)는 언제 약속의 반대가 되는가?
나는 블루버드 약속 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
.
다음으로 제어 흐름도를 나타냅니다.
동기 코드로 표현하려면:
// 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()
하지 않은 는 예외가 발생하지 않은 경우에만 실행됩니다.이 붙은 과 " " " " "break
python이 가지고 있는 것은, 문장이 조금 이상하다고 느껴집니다(권장 읽기!).
// 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
다른 핸들러)then
success
파라미터)를 참조해 주세요.,의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.then
실패할 이 있는 이의 2-파라미터가 됩니다.2번으로 하다then
괜찮을지도 몰라
은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아!then
의 묶음을 하는 기능에 하여 대부분 이 됩니다.이 기능을 의 'Da'가 .실제로 이 작업을 실시했을 경우, 2 파라미터의 형식은then
위의 이유로 미묘하게 동작하지 않습니다.중간 사슬을 사용하면 특히 직관에 반합니다.
복잡한 비동기 작업을 많이 해 본 사람으로서 이 안티패턴을 피하고 개별 핸들러 접근 방식을 택할 것을 권장합니다.
양쪽의 장점과 단점을 살펴봄으로써 우리는 어떤 것이 상황에 적합한지 계산된 추측을 할 수 있다.이것은 약속을 이행하기 위한 두 가지 주요 접근법입니다.둘 다 장단점이 있다
캐치 어프로치
some_promise_call()
.then(function(res) { logger.log(res) })
.catch(function(err) { logger.log(err) })
이점
- 모든 오류는 하나의 캐치 블록으로 처리됩니다.
- 그 후 블록에서 예외도 포착합니다.
- 복수의 성공 콜백 체인
단점들
- 체인의 경우는, 다른 에러 메세지를 표시하기 어려워집니다.
성공/오류 접근법
some_promise_call()
.then(function success(res) { logger.log(res) },
function error(err) { logger.log(err) })
이점
- 미세한 오류 제어가 이루어집니다.
- db error, 500 error 등 다양한 카테고리의 에러에 대해 공통 에러 처리 기능을 사용할 수 있습니다.
디파티지
- 한 번 더 예요.
catch
간단한 설명:
ES2018년
인수 onRejected를 사용하여 캐치 메서드를 호출하면 다음 절차가 수행됩니다.
- 약속을 이 가치로 합시다.
- 반품?호출(약속, "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()
처리된다.
- 만약 약속이 거절당했다면.사진의 #3을 참조
- 의 성공 핸들러에서 에러가 발생했을 경우는, 다음의 행 번호 4 ~7 의 사이에 있습니다.#2 를 참조해 주세요( 「 2. a 」 の 「 Failure 」 ( 「 」2 . a ) 。
then()
을 참조해 주세요. - 의 장애 핸들러에서 에러가 발생했을 경우는, 다음의 행 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
'source' 카테고리의 다른 글
Angular에서 동적으로 외부 스크립트를 로드하려면 어떻게 해야 합니까? (0) | 2022.12.13 |
---|---|
Angular에서 앵커 해시 링크를 처리하는 방법JS (0) | 2022.12.13 |
왼쪽 결합이 이중인 MySQL Update 행, 첫 번째 일치 제한 (0) | 2022.12.13 |
Java Generics: 목록에 캐스트할 수 없는가? (0) | 2022.12.13 |
2개의 조인 및 구별로 그룹화된 mysql 쿼리 최적화 (0) | 2022.12.13 |