소프트웨어/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에 안걸리고 진짜 에러가 된다.