Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

은학의 코딩 일기장

[javascript] Promise 본문

Javascript

[javascript] Promise

<Eunhak> 2024. 9. 3. 13:41

Promise란?

자바스크립트 비동기 통신에 사용되는 객체중 하나로 비동기 작업의 완료 또는 실패를 나타냄

기존 callback 방식의 call back 지옥을 해결하기 위해 Promise가 사용됨

Promise의 이점

  • 비동기 처리 시점을 명확하게 표현할 수 있다.
  • 연속된 비동기 처리 작업을 수정, 삭제, 추가하기 편하고 유연하다.
  • 비동기 작업 상태를 쉽게 확인할 수 있다.
  • 코드의 유지 보수성이 증가한다.

Promise 3가지 상태

Pending(대기) : 비동기 로직이 아직 완료되지 않은 상태

Fullfilled(이행) : 비동기 작업이 처리되어 프로미스가 결과값을 반환해준 상태

rejected(실패) : 비동기 작업이 실패된 상태

후속 처리 메소드

then

  • then 메소드는 두 개의 콜백 함수를 인자로 전달 받습니다.
  • 첫 번째 콜백 함수는 성공(fulfilled, resolve 함수가 호출된 경우)시에 실행됩니다.
  • 두 번째 콜백 함수는 실패(rejected, reject 함수가 호출된 경우)시에 실행됩니다.
  • then 메소드는 기본적으로 프로미스를 반환합니다.
const promise = () => new Promise((resolve, reject) => {
    let a = 1 + 1

    if(a == 3) {
        resolve('success')
    } else {
        reject('failed')
    }
})

promise().then((message) => {
    console.log('This is in the then ' +  message)
}, (error) => {
    console.log('This is in the then ' +  error)
})

catch

  • catch 메소드는 비동기 처리 혹은 then 메소드 실행 중 발생한 에러(예외)가 발생하면 호출됩니다.
  • catch 메소드 역시 프로미스를 반환합니다.
const promise = () => new Promise((resolve, reject) => {
    let a = 1 + 1

    if(a == 3) {
        resolve('success')
    } else {
        reject('failed')
    }
})

promise().then((message) => {
    console.log('This is in the then ' +  message)
}).catch((error) => {
    console.log('This is in the catch ' + error)
})

프로미스 체이닝

프로미스의 특징 중 하나는 프로미스를 여러개를 연결하여 사용할 수 있다는 것

then 메소드를 호출하여 아래와같이 연결할 수 있음

function getData() {
  return new Promise({
// ...});
}

// then() 으로 여러 개의 프로미스를 연결한 형식getData()
getData()
  .then(function(data) {
    // ...
  })
  .then(function() {
    // ...
  })
  .then(function() {
    // ...
  });

Promise.all()

promise.all은 promise가 담겨있는 배열과 같은 이터러블 객체를 인자로 받음

인자로 전달받은 모든 promise를 병렬로 처리하고 그 결과값을 배열에 받아 resolve로 반환함

서로 의존관계이지 않은 여러 프로미스들을 이터러블 객체에 담아 Promise.all 메소드를 이용해 한번에 병렬처리 할 수 있음

가장 마지막으로 끝나는 프로미스를 기준으로 수행되고, 모든 프로미스가 fullfilled 상태가 되면 결과값을 배열에 담아 새로운 프로미스를 반환

Promise.all([
    new Promise(resolve => setTimeout(() => resolve(1), 1000)),
    new Promise(resolve => setTimeout(() => resolve(2), 2000)),
    new Promise(resolve => setTimeout(() => resolve(3), 3000))
]).then(console.log) // 프로그램을 실행하고 3초뒤에 실행됨
.catch(console.log)
[ 1, 2, 3 ]

'Javascript' 카테고리의 다른 글

[javascript] 이벤트루프  (1) 2024.09.02
[javascript] 클로저 / 스코프  (0) 2024.09.02
[Javascript] 단축평가 논리 계산법  (0) 2023.03.28