본문 바로가기
Language/JavaScript & TypeScript

[JavaScript] Promise

by junseokoo 2024. 11. 28.

  • 콜백이 중첩되는 경우(콜벡헬)가 발생하면서, 이를 해결할 방안으로 등장!
  • Promise 패턴을 사용하면 비동기 작업들을 순차적으로 진행하거나, 병렬로 진행하는 등의 컨트롤이 보다 수월해진다.
  • 또한 예외처리에 대한 구조가 존재하기 때문에 오류 처리 등에 대해 보다 가시적으로 관리 가능!
  • 그러니까 Promise 쓰면 then만 하지말고 꼭 catch로 에러도 잡아주자!
let promiseEx = function (param) {
    return new Promise(function (resolve, reject) { // promise 객체에서 파라미터로 익명함수를 받고 그 익명함수는 resolve와 reject를 파라미터로 받음

        // 비동기 표현
        window.setTimeout(() => {
            // 파라미터가 참이면
            if (param) {
                // 해결
                resolve('resolve');
            }
            // 거짓이면
            else {
                // 실패
                reject(Error('failed'));
            }
        },3000)
    })
}

// Promise 실행
promiseEx(true) // promise 함수를 호출해서 Promise 객체가 리턴된다. 
    .then(JSON.parse) // 에러 유발시킴 promiseEx에서 만든 객체는 성공또는 실패시 String을 리턴하기 때문
    .catch ( () => { // 그래서 여기서 에러를 잡아준다.
        alert('체이닝 중간에 에러!');
    })
    .then( text => { // 위에 catch에서 걸려서 여기 then으로 이동하지 못함.
        console.log(text);
    })
  • promise state
    • pending
      • 아직 수행중인 상태 fulfilled 혹은 reject 되게 전 상태
    • fulfilled
      • 수행된 상태
    • rejected
      • 실패된 상태
    • settled
      • 수행이되고 실패가 되든 성공이되든 일단 결론이 난 상태

Promise.all

  • 여러개의 비동기 작업들이 존재하고 이들이 모두 완료되었을 때 작업을 진행하고 싶을때 사용!
let promise1 = new Promise((resolve, reject) => {
    setTimeout(() => {

        console.log('첫번째 Promise 완료');
        resolve('11111');
    }, 3000)
});

let promise2 = new Promise((resolve, reject) => {
    setTimeout( () => {
        console.log('두번째 Promise 완료');
        resolve('222222');
    }, 2000)
});

Promise.all([promise1, promise2]).then( valuse => {
    console.log('모두 완료', valuse);
})

// 결과
// 두번째 Promise 완료
// 첫번째 Promise 완료
// 모두 완료 [ '11111', '222222' ]
  • 두번째 Promise가 완료된 뒤에 첫번째 Promise가 완료되면 최종적으로 전체값을 보여준다.

return 하지 않고 바로 new Promise 생성

  • Promise 객체에 파라미터로 넘겨준 익명함수는 즉각 실행된다.
  • 위의 코드를 return 하는 형태로 변경
  • let promise1 = function () { return new Promise((resolve, reject) => { setTimeout(() => { console.log('첫번째 Promise 완료'); resolve('11111'); }, 3000) }); }

let promise2 = function () {
return new Promise((resolve, reject) => {
setTimeout(() => {

        console.log('두번째 Promise 완료');
        resolve('222222');
    }, 2000)
});

}

// Promise.all([promise1, promise2]).then( valuse => {
// console.log('모두 완료', valuse);
// })

Promise.all([promise1(), promise2()])
.then( values => {
console.log('모두 완료', values)
})

```

  • 위의 예시는 그 위의 예시와 같이 Promise.all을 사용할 수 없다.
  • 위의 주석처럼 사용하면 Promise 객체가 아니기 때문에 에러가 나온다.

 

'Language > JavaScript & TypeScript' 카테고리의 다른 글

[JavsScript] this  (0) 2025.04.09
[JavaScript] Async/Await  (0) 2024.11.28
[JavaScript] Closure  (0) 2024.11.28
[JavaScript] Hoisting  (0) 2024.11.28
[JavaScript] Event-Loop  (0) 2024.11.28