Bluebird의 finally
에 대한 문서를 볼 수 있지만 차이점은 then
대 아직도 이해가되지 않습니다.그 때와 마지막으로 약속의 차이점은 무엇입니까?
명확하게 : catch
뒤에 then
이 왜 호출되는지 정확히 알고 있습니다. I 은 캐치 후에을 호출하려고합니다. 그것이 의도입니다. 제 질문은 : 이 약속 상태에 관계없이 항상 실행될 코드 인 경우 then
대 finally
의 차이점은 무엇입니까? 해결 된 약속
.then(...).catch(...).then(...)
:이var Promise = require("bluebird"); function test1() { console.log("RESOLVE + THEN + CATCH + THEN"); return new Promise((resolve, reject) => resolve()) .then(() => console.log("then")) .catch(err => console.log("error:", err.message)) .then(() => console.log("end")); } function test2() { console.log("REJECT + THEN + CATCH + THEN"); return new Promise((resolve, reject) => reject(new Error("rejected"))) .then(() => console.log("then")) .catch(err => console.log("error:", err.message)) .then(() => console.log("end")); } function test3() { console.log("RESOLVE + THEN + CATCH + FINALLY"); return new Promise((resolve, reject) => resolve()) .then(() => console.log("then")) .catch(err => console.log("error:", err.message)) .finally(() => console.log("end")); } function test4() { console.log("REJECT + THEN + CATCH + FINALLY"); return new Promise((resolve, reject) => reject(new Error("rejected"))) .then(() => console.log("then")) .catch(err => console.log("error:", err.message)) .finally(() => console.log("end")); } // run tests "sequentially" so console output doesn't get blended setTimeout(test1, 500); setTimeout(test2, 1000); setTimeout(test3, 1500); setTimeout(test4, 2000);
이 네 개의 케이스를 테스트합니다
나는이 테스트를 만들었습니다..then(...).catch(...).then(...)
약속이 거부되었습니다..then(...).catch(...).finally(...)
해결 된 약속이 있습니다..then(...).catch(...).finally(...)
약속이 거부되었습니다. I 참조
결과는 1 개 + 2 + 3과 동일하게 행동한다 (4)의 경우이다 : 의도 한대로 마지막 비트 (then
finally
또는 테스트)에 따라, 이전에 관계없이 일어나는 실행하지 않는다. 나는 comment on this other question I asked 보았 기 때문에 이제
RESOLVE + THEN + CATCH + THEN
then
end
REJECT + THEN + CATCH + THEN
error: rejected
end
RESOLVE + THEN + CATCH + FINALLY
then
end
REJECT + THEN + CATCH + FINALLY
error: rejected
end
, 내가 부탁 해요 이유는 다음과 같습니다 : 그 프로그램의 출력은 당신의 약속을 지원하는 경우
확실하지,하지만 당신은 마지막
.then
을 변경해야합니다.finally
으로 변경하여busy
이 항상 지워집니다.then
이 충분처럼 내 매우 제한된then
의 지식, 위의 테스트에서
, 그것은 보인다. 그러나 그 의견을 말한 후에 나는 "finally"코드를 실행하기 위해 then
을 사용하는 자신과 안전에 대해 질문하고 있습니다.
제 질문은 then
과 finally
의 차이점은 무엇입니까? 그들은 처럼처럼 보이지만, 언제 then
대신 finally
을 사용해야합니까?
귀하의 질문은 왜 종결되는 것 같습니까? 그렇다면 귀하의 거절 된 약속에 전화를 걸겠습니까? .catch 문서를 읽으면 대답 할 수 있습니다. –
@KevinB 아니, 전혀. 나는 왜 '다음'이 '캐치'후에 호출되는지 정확히 알 수 있습니다. 나는 * 캐치 후에 호출하도록 * 요청합니다. 나는 묻는다 : 만약 약속 상태에 관계없이 * 코드가 항상 실행되기를 원한다면,'then'과'finally'의 차이는 무엇인가? –
당신이 항상 거부 된 약속을 포착한다면, 오직 당신이 약속을 해결했을 뿐이며, 물론 약간의 차이가 있습니다 ... 나는 당신의 질문의 요점을 놓치고 있습니까? 이 모든 것은 명백해 보인다. –