전후 캐치 위치
퍼팅의 차이를 이해하는 데 어려움이 있습니다..catch
그 전과 후는 중첩된 약속입니다.
대안 1:
test1Async(10).then((res) => {
return test2Async(22)
.then((res) => {
return test3Async(100);
}).catch((err) => {
throw "ERROR AFTER THEN";
});
}).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
대안 2:
test1Async(10).then((res) => {
return test2Async(22)
.catch((err) => {
throw "ERROR BEFORE THEN";
})
.then((res) => {
return test3Async(100);
});
}).then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
. 은 숫자가 다함동음같과습다니작각은수의이면 합니다. 숫자가 다음이면 test1이 실패합니다.<0
가 "test2"일 경우 합니다.> 10
가 test3가 아닌 경우 합니다.100
이 경우 test2는 실패할 뿐입니다.
실행하여 test2Async를 실패하게 하려고 했습니다. 그러면 BEAR와 AFTER가 모두 동일하게 동작하고 테스트를 실행하지 않습니다.3비동기식입니다. 캐치볼을 다른 곳에 두는 것의 주요 차이점을 누가 설명해 주시겠습니까?
I 각 함 에 I 서console.log('Running test X')
실행 여부를 확인하기 위해.
이 질문은 제가 게시한 이전 스레드 때문에 발생합니다. 중첩된 호출을 약속으로 되돌리는 방법?저는 그것이 다른 문제이고 다른 주제를 올릴 가치가 있다고 생각합니다.
두 입니다.p
는 일부 이전 코드에서 생성된 약속입니다.):
return p.then(...).catch(...);
그리고.
return p.catch(...).then(...);
p가 해결하거나 거부할 때 차이가 있지만, 이러한 차이가 중요한지 아닌지는 내부의 코드가 무엇인지에 따라 달라집니다..then()
또는.catch()
핸들러가 합니다.
다음과 같은 경우 발생하는 현상p
해결 방법:
첫 번째 계획에서, 언제p
해됨결,.then()
핸들러가 호출되었습니다.에 그 에약.then()
핸들러는 값을 반환하거나 결국 해결되는 다른 약속을 반환합니다..catch()
핸들러를 건너뜁니다.하지만, 만약에.then()
핸들러는 결국 거부하는 약속을 던지거나 반환합니다..catch()
처리기가 원래 약속의 거부 모두에 대해 실행합니다.p
그나또오발다니생합류가한러에도 합니다..then()
파일
두 번째 계획에서, 언제p
해됨결,.then()
핸들러가 호출되었습니다.에 그 에약.then()
핸들러는 결국 거부하는 약속을 던지거나 반환합니다..catch()
처리기가 체인에 있기 전이기 때문에 찾을 수 없습니다.
이것이 바로 차이입니다.에 약에만..catch()
AFTER이며, AFTER, AFTER 할 수 ..then()
파일
다음과 같은 경우 발생하는 현상p
거부:
첫 이 자이면 첫번만계약약이속, 약속이서째에획만▁now▁the약,이.p
에 부거, 그면러.then()
" "는 " " 입니다..catch()
예상대로 핸들러가 호출됩니다.에서 일..catch()
처리기는 최종 결과로 반환되는 항목을 결정합니다. 에서 값을 ..catch()
결국 해결되는 약속을 처리하거나 반환한 다음 오류를 "수정"하고 정상적으로 반환했기 때문에 약속 체인이 해결된 상태로 전환됩니다.만약 당신이 거부된 약속을 던지거나 돌려준다면,.catch()
그러면 반환된 약속이 거부된 상태로 유지됩니다.
에서, 이 째계번에서라면, 그약속이만.p
에 부거, 그면러.catch()
핸들러가 호출되었습니다.정상 값 또는 최종적으로 에서 해결되는 약속을 반환하는 경우.catch()
"), 약속 되고 "오류 처리", "오류 처리",.then()
뒤의 .catch()
호출됩니다.
이것이 바로 차이입니다. #2.에 약에만..catch()
할 수 "삐삐", "삐삐", "삐삐"를 할 수 ..then()
여전히 호출될 핸들러입니다.
다음 중 사용할 때:
이 단지 째 성 번 표 첫 원 경.catch()
원래 약속 중 하나에서 오류를 잡을 수 있는 핸들러p
는또에에서..then()
되어 있습니다.p
다음을 건너뛰어야 합니다..then()
파일
약속에서 를 발견하고 싶다면 두 번째 방법을 사용하세요.p
) "" "" " " " " " " " " " 를 합니다..then()
파일
다른 옵션
을 모두 할 수 있는 이 하나 더 이두 콜백을 사용할 수 ..then()
다음과 같이:
p.then(fn1, fn2)
이다음중한보다니장합가지만는 중 만 사용할 수 .fn1
또는fn2
전화가 올 거예요. 만약에.p
된 다음 해결, 음다fn1
호출될 것입니다. 만약에.p
에 부거, 그면fn2
호출됩니다.결과가 변경되지 않음fn1
절대로 만들 수 없는fn2
호출되거나 그 반대로 호출됩니다.따라서 핸들러 자체에서 발생하는 작업에 관계없이 두 핸들러 중 하나만 호출되도록 하려면 다음을 사용할 수 있습니다.p.then(fn1, fn2)
.
jfriend00의 답변은 훌륭하지만, 유사한 동기 코드를 추가하는 것이 좋을 것 같습니다.
return p.then(...).catch(...);
동기식과 유사합니다.
try {
iMightThrow() // like `p`
then()
} catch (err) {
handleCatch()
}
한다면iMightThrow()
지않고지.then()
호출됩니다.만약 그것이 던진다면 (또는 만약)then()
스스로 던짐), 그 다음handleCatch()
호출됩니다.사용 방법에 주목하십시오.catch
블록의 여부를 제어할 수 없습니다.then
이 호출됩니다.
반면에,
return p.catch(...).then(...);
동기식과 유사합니다.
try {
iMightThrow()
} catch (err) {
handleCatch()
}
then()
이경면, 약만.iMightThrow()
않고, 그럼던지마지마▁doesn던,지지▁then▁throw.then()
실행합니다.만약 그것이 던져진다면, 그것은 다음과 같은 것입니다.handleCatch()
여부를 결정하기 위해then()
라고 불리는데, 왜냐하면 만약handleCatch()
그 다음에 그럼, 기지되then()
예외가 호출자에게 즉시 던져지기 때문에 호출되지 않을 것입니다.handleCatch()
처리할 수 . 그러면 그면문처게 수then()
호출됩니다.
언급URL : https://stackoverflow.com/questions/42013104/placement-of-catch-before-and-after-then
'source' 카테고리의 다른 글
PrestaShop은 이유 없이 /tmp에 #sql_파일을 생성합니다. (0) | 2023.07.25 |
---|---|
C/C++ int 또는 unsigned int 사용 (0) | 2023.07.25 |
웹 서비스 API Keys 및 Ajax - 키 보호 (0) | 2023.07.25 |
JavaScript의 KeyCode에서 문자 값 가져오기...그다음 다듬기 (0) | 2023.07.25 |
날짜가 유효한지 확인합니다. (0) | 2023.07.25 |