소프트웨어/javascript
promise의 엉뚱한 생각 - promise 중간에 빠져나오기
개발자_이훈규
2021. 7. 21. 08:56
new Promise((resolve1, reject) => {
reject('break!')
// throw new Error("에러 발생!");
// new Promise((resolve2, reject) => {
// console.log("promise 1");
// setTimeout(resolve2, 1000);
// }).then(resolve1);
}).then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
then을 써두고 promise를 return할거라고 예상했는데, return을 하지 않으면 어떻게하지?
그리고 로직이 중간에 끊겼는데 promise chain에서 어떻게 빠져나갈 수 있을까?
(() => {
return null; // <- error
return new Promise((resolve, reject) => {
console.log("promise 1");
setTimeout(resolve, 1000);
})
})().then(() => {
console.log("promise 2");
});
promise를 빠져나가보자!
첫 번째 시도, Error를 날리자
하지만 catch에 안걸려서 fail
(() => {
throw new Error("에러 발생!");
return null;
return new Promise((resolve, reject) => {
console.log("promise 1");
setTimeout(resolve, 1000);
})
})().then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
두 번째 시도, Error를 날리는데 가장 위에 객체도 promise로 만들자
그러니 성공!
new Promise((resolve, reject) => {
throw new Error("에러 발생!");
}).then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
마지막, 그럼 맨 처음 구조에다가 error를 날리는 부분을 합치면!
끝
new Promise((resolve1, reject) => {
// throw new Error("에러 발생!");
new Promise((resolve2, reject) => {
console.log("promise 1");
setTimeout(resolve2, 1000);
}).then(resolve1);
}).then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
근데 생각해보니 일반 function이 아니라 promise를 사용할거면 그냥 reject를 쓰면 되는데...
new Promise((resolve1, reject) => {
reject('break!')
// throw new Error("에러 발생!");
// new Promise((resolve2, reject) => {
// console.log("promise 1");
// setTimeout(resolve2, 1000);
// }).then(resolve1);
}).then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
번외.
promise에서 catch는 가장 가까운 것이 동작한다고 했는데
위 구조에서 속에 promise에서 error가 발생해도 밖에 promise의 catch에 걸릴까?
new Promise((resolve1, reject) => {
new Promise((resolve2, reject) => {
console.log("promise 1");
throw new Error("에러 발생!");
setTimeout(resolve2, 1000);
}).then(resolve1);
}).then(() => {
console.log("promise 2");
}).catch((e)=>console.log("error : ", e))
정답은 catch에 안걸리고 진짜 에러가 된다.