Promise

JavaScript νŠΉμ„±μƒ μ‹±κΈ€ μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λŒ€λΆ€λΆ„μ˜ μž‘μ—…λ“€μ€ λΉ„λ™κΈ°λ‘œ 이루어진닀.

ν•˜μ§€λ§Œ μ΅œκ·Όμ— μžλ°”μŠ€ν¬λ¦½νŠΈ 기술의 λ°œμ „κ³Ό ν•˜λ‚˜μ˜ μž‘μ—…μ„ 콜백으둜 κ²°κ³Όλ₯Ό 받은뒀 순차적으둜 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³ μž ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같은 콜백 쀑첩 (콜백 지μ˜₯) 을 κ²½ν—˜ν•˜κ²Œ λœλ‹€.

async(1, function () {
  async(2, function () {
    async(3, function () {
      async(4, function () {
        async(5, function () {
          console.log('μž‘μ—… μ™„λ£Œ???!!??!!')
        });
      });
    });
  });
});

μ΄λŸ¬ν•œ 상황을 κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ μ˜€λž˜μ „λΆ€ν„° Promies λΌλŠ” νŒ¨ν„΄μ΄ μ œμ•ˆλ˜μ–΄ μ™”μœΌλ©° λ‹€μ–‘ν•œ 라이브러리λ₯Ό ν†΅ν•΄μ„œ 이λ₯Ό κ΅¬ν˜„ν•˜μ—¬ μ‚¬μš©ν•΄ μ™”λ‹€.

Promise νŒ¨ν„΄μ€ ES5 ν™˜κ²½μ—μ„œ 일뢀 λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜λ©° ES6 에 정식 μŠ€νŒ©μ— ν¬ν•¨λ˜μ—ˆλ‹€.

λΈŒλΌμš°μ €λ³„ 지원 μ—¬λΆ€

IE λŠ” μ‚¬μš© λΆˆκ°€ν•˜μ—¬ Polyfill μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•΄μ•Ό 함
Chrome, FF λŠ” Full Support

μ•„λž˜λŠ” HTML5Rocks μ—μ„œ 보이고 μžˆλŠ” ν”„λ‘œλ―ΈμŠ€μ˜ 예제 이닀.

ν”„λ‘œλ―ΈμŠ€ μ˜ˆμ‹œ

asyncThing1()
  .then( () => asyncThing2() )
  .then( () => asyncThing3() )
  .catch( error => asyncRecovery1() )
    then( () => asyncThing4(), () => asyncRecovery2() )
      .catch( error => console.log('Don\'t worry about it') )
        then( () => console.log('All done') );

Syntax

new Promise(function (resolve, reject) {
  /* statement */
});

μ‹€ν–‰μ‹œ Promise κ΅¬λ¬Έμ—μ„œ μ‹€ν–‰ν•œ 읡λͺ…ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ€ λ¬΄μ‹œλœλ‹€.

  • resolve
    • μ„±κ³΅μ‹œ μ „λ‹¬λ˜λŠ” 인수 (ν•¨μˆ˜ ν˜Ήμ€ λ³€μˆ˜)
  • reject
    • μ‹€νŒ¨μ‹œ μ „λ‹¬λ˜λŠ” 인수 (ν•¨μˆ˜ ν˜Ήμ€ λ³€μˆ˜)

μ„ μ–Έ

Promise 의 기본적인 선언은 μ•„λž˜μ™€ κ°™λ‹€.

var _promise = function (param) {
  return new Promise(function (resolve, reject) {
    window.setTimeout(function () {
      if (param) {
        resolve('Success');
      } else {
        reject(Error('Failed'));
      }
    }, 3000);
  });
}

Promise μ‚¬μš©μ‹œ λ‹€μŒ μƒνƒœμ€‘μ— ν•˜λ‚˜κ°€ 될 것이닀.

  • pending
    • 아직 Promise λ₯Ό μˆ˜ν–‰μ€‘μΈ μƒνƒœ
  • fulfilled
    • Promise κ°€ 성곡적인 μƒνƒœμ΄λ‹€.
  • rejected
    • Promise κ°€ μ‹€νŒ¨ν•œ μƒνƒœμ΄λ‹€.
  • settled
    • Promise 성곡여뢀와 상관없이 μ™„λ£Œλœ μƒνƒœμ΄λ‹€.

new Promise 둜 Promise κ°€ μƒμ„±λ˜λŠ” 직후뢀터 resolve λ‚˜ reject κ°€ 호좜되기 μ „κΉŒμ§€μ˜ μˆœκ°„μ„ pending μƒνƒœλΌκ³  λ³Ό 수 μžˆλ‹€.
이후 비동기 μž‘μ—…μ΄ λ§ˆμΉœλ’€ 결과물을 μ•½μ†λŒ€λ‘œ 잘 쀄 수 μžˆλ‹€λ©΄ 첫번째 νŒŒλΌλ©”ν„°λ‘œ μ£Όμž…λ˜λŠ” resolve ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , μ‹€νŒ¨ν–ˆλ‹€λ©΄ reject ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것이 기본적인 Promise κ°œλ…μ΄λ‹€.

이λ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹€ν–‰λΆ€λŠ” μ•„λž˜μ™€ κ°™λ‹€.

_promise(true)
  .then(function (message) {
    console.log(message);
  }, function (error) {
    console.error(error);
  });

μ‹€ν–‰λΆ€μ—μ„œλŠ” _promise() λ₯Ό μ‹€ν–‰ν•˜λ©΄ Promise 의 μƒˆλ‘œμš΄ 객체가 λ°˜ν™˜λ˜κ³  μ •μƒμ μœΌλ‘œ 비동기 μž‘μ—…μ΄ μˆ˜ν–‰λ¬μ„λ•Œ then 을 ν˜ΈμΆœν•˜λŠ” API κ°€ μ‘΄μž¬ν•œλ‹€.
then 은 μ„±κ³΅μ‹œ 첫번째 νŒŒλΌλ©”ν„°λ₯Ό μˆ˜ν–‰ν•˜λ©°, μ‹€νŒ¨μ‹œ λ‘λ²ˆμ§Έ νŒŒλΌλ©”ν„°λ₯Ό μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

μ˜ˆμ™Έμ²˜λ¦¬

Javascript ν•¨μˆ˜μ˜ μ²΄μ΄λ‹μœΌλ‘œ μ—°κ²°λœ ν˜•νƒœμ—μ„œ 비동기 μž‘μ—…μ΄ 쀑간에 μ—λŸ¬λ‚  경우 λ‹€μŒκ³Ό 같이 처리 κ°€λŠ₯ν•˜λ‹€.

_promise(true)
  .then(JSON.parse)
  .catch(function () {
    alert('Error');
  })
  .then(function (message) {
    console.log(message);
  })

λͺ¨λ“  Promise λ₯Ό μ™„λ£Œν•˜κ³  μ‹€ν–‰

var promise1 = new Promise(function (resolve, reject) {
  window.setTimeout(function () {
    console.log('1st Promise');
    resolve('1');
  }, Math.random() * 20000 + 1000);
});

var promise2 = new Promise(function (resolve, reject) {
  window.setTimeout(function () {
    console.log('2nd Promise');
    resolve('2');
  }, Math.random() * 10000 + 1000);
});

Promise.all([promise1, promise2])
  .then(function (values) {
    console.log('All Complete');
    console.dir(values);
  });

async 와 await

ES8 μ—μ„œ Promise μ‚¬μš©μ„ μ‰½κ²Œ ν•΄μ£ΌλŠ” async 와 await 을 λ„μž… ν•˜μ˜€λ‹€.

μ΄λŠ” 비동기 μ½”λ“œλ₯Ό 더 μ‰½κ²Œ μž‘μ„± κ°€λŠ₯ν•˜κ²Œ ν•˜λ©° 마치 λ™κΈ°ν˜• μ½”λ“œμ²˜λŸΌ μž‘μ„±λ˜μ–΄ 가독성을 높인닀.

async / await λŠ” Promise ꡬ문 처럼 non-blocking 방식이닀.

async

비동기 ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λ©° AsyncFunction 객체λ₯Ό λ°˜ν™˜ ν•©λ‹ˆλ‹€.

AsyncFunction κ°μ²΄λŠ” ν•΄λ‹Ή ν•¨μˆ˜λ‚΄μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” 비동기 ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

await

async ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μ‚¬μš©λ  수 있으며 λ™κΈ°μ μœΌλ‘œ Promise λ₯Ό 처리 ν•΄μ€λ‹ˆλ‹€.

async λ°–μ—μ„œ ν”„λ‘œλ―ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ then μ½œλ°±μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

async function loadData() {
  var promise1 = req('/getData_1.json');
  var promise2 = req('/getData_2.json');

  var response1 = await promise1;
  var response2 = await promise2;

  return response1 + response2;
}

loadData()
  .then(() => {
    console.log('Done');
  });