ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • promise catch error
    JavaScript/입 속의 검은 잎 2022. 10. 5. 18:32
    function 몇초후프로미스에러발생(sec){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject('error!');
            }, sec*1000);
        })
    }
    
    try{
        몇초후프로미스에러발생(3);
    }
    catch(err){
        console.error(err)
    }
    
    """
    node:internal/process/promises:279
                triggerUncaughtException(err, true /* fromPromise */);
                ^
    
    [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "error!".] {
      code: 'ERR_UNHANDLED_REJECTION'
    }
    """

    에러가 안잡힌다.

    3초 딜레이가 콜스택에서 try catch 구문을 지나치기 때문.

     

     

    function 몇초후프로미스에러발생(sec){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject('error!');
            }, sec*1000);
        })
    }
    
    
        몇초후프로미스에러발생(3).catch((err)=>{
            console.log(err);
        })
        
        
    
    // error!

    try catch 구문이 아니라 프로미스 함수 (then, catch 등)로 에러처리를 했다.

    실행이 완료되고 콘솔에 reject 안의 문자열이 찍힌다.

     

    프로미스의 편리한 점은 체인형태로 프로미스 함수를 계속 넣을 수 있다는 것이다.

    그런데 이 때의 체인은 다른 객체나 배열에 메서드체인을 걸 때처럼 같은 객체를 대상으로 하는 것이 아니다.

    프로미스의 체인은 단계마다 새로운 프로미스 인스턴스를 반환한다.

     

    아래에서 1st catch만 콘솔에 찍힌 것은, 그 해당 프로미스 객체의 에러가 잡혀서 두번째 것을 넘어갔기 때문이 아니다.

    첫번째 catch문이 리턴한 새로운 프로미스에 문제가 없었기 때문에 두번째 catch가 반응하지 않은 것이다.

    function 몇초후프로미스에러발생(sec){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject('error!');
            }, sec*1000);
        })
    }
    
    
    
    몇초후프로미스에러발생(3)
    .catch((err)=>{
        console.log('1st catch', err);
    })
    .catch((err)=>{
        console.log('2nd catch', err);
    })
    
    //1st catch error!

     

    function 몇초후프로미스에러발생(sec){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject('error!');
            }, sec*1000);
        })
    }
    
    
    
    몇초후프로미스에러발생(3)
    .catch((err)=>{
        console.log('1st catch', err);
        throw new Error('또 에러!')
    })
    .catch((err)=>{
        console.log('2nd catch', err);
    })
    
    //1st catch error!
    //2nd catch Error: 또 에러!
    function 몇초후프로미스에러발생(sec){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject('error!');
            }, sec*1000);
        })
    }
    
    
    
    몇초후프로미스에러발생(3)
    .then(()=>{
        console.log('done!!!');
        },
        e => {
            console.log('1st catch in then')
            throw new Error('throw in then')
        }
    )
    .catch((err)=>{
        console.log('2nd catch', err);
    })
    
    //1st catch in then
    //2nd catch Error: throw in then

    'JavaScript > 입 속의 검은 잎' 카테고리의 다른 글

    클래스, super, 오버라이딩  (0) 2022.10.12
    async/await  (0) 2022.10.05
    try catch error  (1) 2022.10.05
    json 객체  (0) 2022.10.05
    set()  (0) 2022.09.28
Designed by Tistory.