약속은 거부 된 후에 "처리"될 수 있습니다. 즉, catch 처리기를 제공하기 전에 promise의 거부 콜백을 호출 할 수 있습니다. 이 행동은 쓸 수 있기 때문에 조금 귀찮습니다 ...
var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });
...이 경우 약속은 자동으로 거부됩니다. 캐치 핸들러 추가를 잊어 버린 경우에도 코드는 자동으로 오류없이 계속 실행됩니다. 이로 인해 느리고 찾기 어려운 버그가 발생할 수 있습니다.
Node.js의 경우, 이러한 처리되지 않은 Promise 거부를 처리하고 문제를보고하는 이야기가 있습니다. 이로 인해 ES7 async / await가 나타납니다. 이 예제를 고려하십시오.
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
let temp = await tempPromise;
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
await changeClothes("warm");
} else {
await changeClothes("cold");
}
await teethPromise;
}
위의 예에서 getRoomTemperature가 충족되기 전에 teethPromise가 거부되었다고 가정합니다 (오류 : 치약에서!). 이 경우 teethPromise를 기다릴 때까지 처리되지 않은 Promise 거부가 발생합니다.
내 요점은 ... 우리가 처리되지 않은 약속 거부를 문제로 생각하면 나중에 대기에 의해 처리되는 약속은 실수로 버그로보고 될 수 있습니다. 처리되지 않은 약속 거부가 문제가되지 않는 것으로 간주하면 합법적 인 버그가보고되지 않을 수 있습니다.
이것에 대한 생각?
이것은 Node.js 프로젝트의 토론과 관련이 있습니다.
처리되지 않은 기본 거부 감지 동작
이 방법으로 코드를 작성하는 경우 :
function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
return Promise.resolve(tempPromise)
.then(temp => {
// Assume `changeClothes` also returns a Promise
if (temp > 20) {
return Promise.resolve(changeClothes("warm"));
} else {
return Promise.resolve(changeClothes("cold"));
}
})
.then(teethPromise)
.then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}
getReadyForBed가 호출되면 최종 (반환되지 않은) 약속을 동기식으로 작성합니다.이 약속은 다른 약속과 동일한 "처리되지 않은 거부"오류가 있습니다 (물론 엔진에 따라 다를 수는 없음). (당신의 함수가 아무것도 반환하지 않는 것이 매우 이상합니다. 즉, 비동기 함수는 정의되지 않은 약속을 만듭니다.
캐치없이 지금 약속을하고 나중에 하나를 추가하면 나중에 처리 할 때 대부분의 "처리되지 않은 거부 오류"구현이 실제로 경고를 취소합니다. 다시 말해, async / await는 내가 볼 수있는 "처리되지 않은 거부"토론을 변경하지 않습니다.
이 함정을 피하려면 다음과 같이 코드를 작성하십시오.
async function getReadyForBed() {
let teethPromise = brushTeeth();
let tempPromise = getRoomTemperature();
// Change clothes based on room temperature
var clothesPromise = tempPromise.then(function(temp) {
// Assume `changeClothes` also returns a Promise
if(temp > 20) {
return changeClothes("warm");
} else {
return changeClothes("cold");
}
});
/* Note that clothesPromise resolves to the result of `changeClothes`
due to Promise "chaining" magic. */
// Combine promises and await them both
await Promise.all(teethPromise, clothesPromise);
}
이는 처리되지 않은 약속 거부를 방지해야합니다.