holdanddeepdive / javascript-deep-dive

3 stars 1 forks source link

45장 프로미스 #47

Open sbyeol3 opened 2 years ago

sbyeol3 commented 2 years ago

45장. 프로미스

비동기 처리를 위한 콜백 패턴의 단점

콜백 헬

에러 처리의 한계

try {
  setTimeout(() => { throw new Error('Error!')}, 1000)
} catch (e) {
  console.log(e) // 에러 캐치 불가
}

프로미스의 생성

const promise = new Promise((resolve, reject) => {
  if ('성공') {
    resolve('result');
  } else {
    reject('fail')
  }
})

const promiseGet = (url) => {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url);
    xhr.send();

    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(JSON.parse(xhr.response));
      } else {
        reject(new Error(xhr.status));
      }
    };
  });
};

프로미스의 후속 처리 메서드

Promise.prototype.then

Promise.prototype.catch

Promise.prototype.finally

promiseGet('url')
  .then(res => console.log(res))
  .catch(err => console.log(err))
  .finally(() => console.log('bye'))

프로미스의 에러 처리

프로미스 체이닝

프로미스의 정적 메서드

Promise.resolve / Promise.reject

const resolvedPromise = Promise.resolve([1, 2, 3]);
resolvedPromise.then(console.log); // [1, 2, 3]

const rejectedPromise = Promise.reject(new Error('Error!'));
rejectedPromise.catch(console.log); // Error: Error!

Promise.all

Promise.race

Promise.allSettled

Promise.allSettled([
  new Promise(resolve => setTimeout(() => resolve(1), 2000)),
  new Promise((_, reject) => setTimeout(() => reject(new Error('Error!')), 1000))
  ]).then(console.log)

/*
[
  { status: 'fulfilled', value: 1 },
  {
    status: 'rejected',
    reason: Error: Error!
        at Timeout._onTimeout (/runtime/javascript/3y68wmfcp/HelloWorld.js:3:54)
        at listOnTimeout (internal/timers.js:531:17)
        at processTimers (internal/timers.js:475:7)
  }
]
*/

마이크로태스크 큐

fetch