written by sohyeon, hyemin π‘
μλ°μ€ν¬λ¦½νΈλ λΉλκΈ° μ²λ¦¬λ₯Ό μν νλμ ν¨ν΄μΌλ‘ μ½λ°±ν¨μλ₯Ό μ¬μ©νλ€. νμ§λ§ μ ν΅μ μΈ μ½λ°± ν¨ν΄μ κ°λ
μ±μ΄ λμκ³ λΉλκΈ° μ²λ¦¬ μ€ λ°μν μλ¬μ μμΈ μ²λ¦¬κ° κ³€λνλ©° μ¬λ¬κ°μ λΉλκΈ° μ²λ¦¬ λ‘μ§μ νκΊΌλ²μ μ²λ¦¬νλ κ²λ νκ³κ° μλ€.
ES6μμ λΉλκΈ° μ²λ¦¬λ₯Ό μν λ λ€λ₯Έ ν¨ν΄μΌλ‘ νλ‘λ―Έμ€(Promise)λ₯Ό λμ
νλ€. μ½λ°± ν¨ν΄μ΄ κ°μ§ λ¨μ μ 보μνλ©° λΉλκΈ° μ²λ¦¬ μμ μ λͺ
ννκ² νννλ€.
νλ‘λ―Έμ€λ μμ±μ ν¨μλ₯Ό ν΅ν΄ μΈμ€ν΄μ€ν νλ€.
Promise μμ±μ ν¨μλ λΉλκΈ° μμ
μ μνν μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ°
μ΄ μ½λ°± ν¨μλ resolveμ reject ν¨μλ₯Ό μΈμλ‘ μ λ¬ λ°λλ€.
// Promise κ°μ²΄μ μμ±
const promise = new Promise((resolve, reject) => {
// λΉλκΈ° μμ
μ μννλ€.
if (/* λΉλκΈ° μμ
μν μ±κ³΅ */) {
resolve('result');
}
else { /* λΉλκΈ° μμ
μν μ€ν¨ */
reject('failure reason');
}
}
Promiseλ λΉλκΈ° μ²λ¦¬κ° μ±κ³΅(fulfilled)νμλμ§ λλ μ€ν¨(rejected)νμλμ§ λ±μ μν(state) μ 보λ₯Ό κ°λλ€.
Promise μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ½λ°± ν¨μλ λ΄λΆμμ λΉλκΈ° μ²λ¦¬ μμ
μ μννλ€.
μ΄λ λΉλκΈ° μ²λ¦¬κ° μ±κ³΅
νλ©΄ μ½λ°± ν¨μμ μΈμλ‘ μ λ¬λ°μ resolve ν¨μλ₯Ό νΈμΆνλ€.
μ΄λ νλ‘λ―Έμ€λ fulfilled
(λΉλκΈ° μ²λ¦¬ μν μ±κ³΅) μνκ° λλ€.
λΉλκΈ° μ²λ¦¬κ° μ€ν¨
νλ©΄ reject
ν¨μλ₯Ό νΈμΆνλ€. μ΄λ νλ‘λ―Έμ€λ rejected
(λΉλκΈ° μ²λ¦¬ μν μ€ν¨) μνκ° λλ€.
const promiseAjax = (method, url, payload) => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify(payload));
xhr.onreadystatechange = function () {
// μλ² μλ΅ μλ£κ° μλλ©΄ 무μ
if (xhr.readyState !== XMLHttpRequest.DONE) return;
if (xhr.status >= 200 && xhr.status < 400) {
// resolve λ©μλλ₯Ό νΈμΆνλ©΄μ μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬
resolve(xhr.response); // Success!
} else {
// reject λ©μλλ₯Ό νΈμΆνλ©΄μ μλ¬ λ©μμ§λ₯Ό μ λ¬
reject(new Error(xhr.status)); // Failed...
}
};
});
};
μ μμ μ²λΌ λΉλκΈ° ν¨μ λ΄μμ Promise κ°μ²΄λ₯Ό μμ±νκ³ κ·Έ λ΄λΆμμ λΉλκΈ° μ²λ¦¬λ₯Ό ꡬννλ€. μ΄λ λΉλκΈ° μ²λ¦¬μ μ±κ³΅νλ©΄ resolve λ©μλλ₯Ό νΈμΆνλ€. μ΄λ resolve λ©μλμ μΈμλ‘ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬νλ€. μ΄ μ²λ¦¬ κ²°κ³Όλ Promise κ°μ²΄μ νμ μ²λ¦¬ λ©μλλ‘ μ λ¬λλ€.
λ§μ½ λΉλκΈ° μ²λ¦¬μ μ€ν¨νλ©΄ reject λ©μλλ₯Ό νΈμΆνλ€. μ΄λ reject λ©μλμ μΈμλ‘ μλ¬ λ©μμ§λ₯Ό μ λ¬νλ€. μ΄ μλ¬ λ©μμ§λ Promise κ°μ²΄μ νμ μ²λ¦¬ λ©μλλ‘ μ λ¬λλ€.
Promiseλ‘ κ΅¬νλ λΉλκΈ° ν¨μλ Promise κ°μ²΄λ₯Ό λ°ννμ¬μΌ νλ€. Promiseλ‘ κ΅¬νλ λΉλκΈ° ν¨μλ₯Ό νΈμΆνλ μΈ‘
(promise consumer)μμλ Promise κ°μ²΄μ νμ μ²λ¦¬ λ©μλ(then, catch)λ₯Ό ν΅ν΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Ό λλ μλ¬ λ©μμ§λ₯Ό μ λ¬λ°μ μ²λ¦¬νλ€. Promise κ°μ²΄λ μνλ₯Ό κ°λλ€κ³ νμλ€. μ΄ μνμ λ°λΌ νμ μ²λ¦¬ λ©μλλ₯Ό 체μ΄λ λ°©μμΌλ‘ νΈμΆνλ€. Promiseμ νμ μ²λ¦¬ λ©μλλ μλμ κ°λ€.
-
then λ©μλ
λ κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬ λ°λλ€.
첫 λ²μ§Έ μ½λ°± ν¨μλ μ±κ³΅(fulfilled, resolve ν¨μκ° νΈμΆλ μν) μ νΈμΆλκ³
λ λ²μ§Έ ν¨μλ μ€ν¨(rejected, reject ν¨μκ° νΈμΆλ μν) μ νΈμΆλλ€.
then λ©μλλ Promiseλ₯Ό λ°ννλ€. -
catch λ©μλ
μμΈ(λΉλκΈ° μ²λ¦¬μμ λ°μν μλ¬μ then λ©μλμμ λ°μν μλ¬)κ° λ°μνλ©΄ νΈμΆλλ€.
catch λ©μλλ Promiseλ₯Ό λ°ννλ€.
/*
λΉλκΈ° ν¨μ promiseAjaxμ Promise κ°μ²΄λ₯Ό λ°ννλ€.
Promise κ°μ²΄μ νμ λ©μλλ₯Ό μ¬μ©νμ¬ λΉλκΈ° μ²λ¦¬ κ²°κ³Όμ λν νμ μ²λ¦¬λ₯Ό μννλ€.
*/
promiseAjax('GET', 'http://jsonplaceholder.typicode.com/posts/1')
.then(JSON.parse)
.then(
// 첫 λ²μ§Έ μ½λ°± ν¨μλ μ±κ³΅(fulfilled, resolve ν¨μκ° νΈμΆλ μν) μ νΈμΆλλ€.
render,
// λ λ²μ§Έ ν¨μλ μ€ν¨(rejected, reject ν¨μκ° νΈμΆλ μν) μ νΈμΆλλ€.
console.error
);
λΉλκΈ° μ²λ¦¬ μ λ°μν μλ¬ λ©μμ§λ then λ©μλμ λ λ²μ§Έ μ½λ°± ν¨μ
λ‘ μ λ¬λλ€.
Promise κ°μ²΄μ νμ μ²λ¦¬ λ©μλ catch
λ₯Ό μ¬μ©ν΄λ μλ¬λ₯Ό μ²λ¦¬ν μ μλ€.
promiseAjax('GET', 'http://jsonplaceholder.typicode.com/posts/1')
.then(JSON.parse)
.then(render)
.catch(console.error);
then λ©μλμ λ λ²μ§Έ μ½λ°± ν¨μλ λΉλκΈ° μ²λ¦¬μμ λ°μν μλ¬(reject ν¨μκ° νΈμΆλ μν)λ§μ μΊμΉνλ€.
νμ§λ§ catch λ©μλλ λΉλκΈ° μ²λ¦¬μμ λ°μν μλ¬(reject ν¨μκ° νΈμΆλ μν)λΏλ§ μλλΌ then λ©μλ λ΄λΆμμ λ°μν μλ¬λ μΊμΉνλ€.
λ°λΌμ μλ¬ μ²λ¦¬λ catch λ©μλλ₯Ό μ¬μ©νλ νΈμ΄ λ³΄λ€ ν¨μ¨μ μ΄λ€.
λΉλκΈ° ν¨μμ μ²λ¦¬ κ²°κ³Όλ₯Ό κ°μ§κ³ λ€λ₯Έ λΉλκΈ° ν¨μλ₯Ό νΈμΆν΄μΌ νλ κ²½μ°,
ν¨μμ νΈμΆμ΄ μ€μ²©(nesting)μ΄ λμ΄ λ³΅μ‘λκ° λμμ§λ μ½λ°± ν¬
μ΄ λ°μνλ€. νλ‘λ―Έμ€λ νμ μ²λ¦¬ λ©μλλ₯Ό 체μ΄λ(chainning)νμ¬ μ¬λ¬ κ°μ νλ‘λ―Έμ€λ₯Ό μ°κ²°νμ¬ μ¬μ©ν μ μλ€. μ΄λ‘μ¨ μ½λ°± ν¬μ ν΄κ²°νλ€.
Promise κ°μ²΄λ₯Ό λ°νν λΉλκΈ° ν¨μλ νλ‘λ―Έμ€ νμ μ²λ¦¬ λ©μλμΈ thenμ΄λ catch λ©μλλ₯Ό μ¬μ©ν μ μλ€.
λ°λΌμ then λ©μλκ° Promise κ°μ²΄λ₯Ό λ°ννλλ‘ νλ©΄(then λ©μλλ κΈ°λ³Έμ μΌλ‘ Promiseλ₯Ό λ°ννλ€.) μ¬λ¬ κ°μ νλ‘λ―Έμ€λ₯Ό μ°κ²°ν΄ μ¬μ©ν μ μλ€.