- μλ°μ€ν¬λ¦½νΈλ λΉλκΈ° μ²λ¦¬λ₯Ό μν νλμ ν¨ν΄μΌλ‘
μ½λ°± ν¨μλ₯Ό μ¬μ©νλ€. - μ ν΅μ μΈ μ½λ°± ν¨ν΄μ
μ½λ°± ν¬λ‘ μΈν΄ κ°λ μ±μ΄ λμκ³ λ²λκΈ° μ²λ¦¬ μ€ λ°μν μλ¬μ μ²λ¦¬κ° κ³€λνλ©° μ¬λ¬ κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό νλ²μ μ²λ¦¬νλ λ°λ νκ³κ° μλ€. - ES6μμλ λΉλκΈ° μ²λ¦¬λ₯Ό μν λ λ€λ₯Έ ν¨ν΄μΌλ‘
νλ‘λ―Έμ€(Promise)λ₯Ό λμ νλ€. - νλ‘λ―Έμ€λ μ ν΅μ μΈ μ½λ°± ν¨ν΄μ΄ κ°μ§ λ¨μ μ 보μνμ¬ λΉλκΈ° μ²λ¦¬ μμ μ λͺ ννκ² ννν μ μλ€λ μ₯μ μ΄ μλ€.
π λκΈ°μ μ²λ¦¬λͺ¨λΈ(Synchronous processing model)κ³Ό λΉλκΈ°μ μ²λ¦¬ λͺ¨λΈ(Asynchronous processing model)
λκΈ°μ μ²λ¦¬ λͺ¨λΈμ μ§λ ¬μ μΌλ‘ νμ€ν¬λ₯Ό μννλ€. μ¦, νμ€ν¬λ μμ°¨μ μΌλ‘ μ€νλλ©° μ΄λ€ μμ μ΄ μνμ€μ΄λ©΄ λ€μ νμ€ν¬λ λκΈ°νλ€.λΉλκΈ°μ μ²λ¦¬ λͺ¨λΈμ λ³λ ¬μ μΌλ‘ νμ€ν¬λ₯Ό μννλ€. μ¦, νμ€ν¬κ° μ’ λ£λμ§ μμ μνλΌ νλλΌλ λκΈ°νμ§ μκ³ μ¦μ λ€μ νμ€ν¬λ₯Ό μννλ€.- μλ°μ€ν¬λ¦½νΈμ λλΆλΆμ DOM μ΄λ²€νΈμ Timer ν¨μ(setTimeout, setInterval), Ajax μμ²μ λΉλκΈ°μ μ²λ¦¬ λͺ¨λΈλ‘ λμνλ€.
- μλ°μ€ν¬λ¦½νΈμμ λΉλκΈ°μ μ²λ¦¬ λͺ¨λΈμ μμ²μ λ³λ ¬λ‘ μ²λ¦¬νμ¬ λ€λ₯Έ μμ²μ΄
λΈλ‘νΉ(μμ μ€λ¨)λμ§ μλ μ₯μ μ΄ μλ€. - νμ§λ§, λΉλκΈ° μ²λ¦¬λ₯Ό μν΄ μ½λ°± ν¨ν΄μ μ¬μ©νλ©΄ μ²λ¦¬ μμλ₯Ό 보μ₯νκΈ° μν΄ μ¬λ¬ κ°μ μ½λ°± ν¨μκ°
λ€μ€ν (nesting, μ€μ²©)λμ΄ λ³΅μ‘λκ° λμμ§λμ½λ°± ν¬(Callback hell) μ΄ λ°μνλ€λ λ¨μ μ΄ μλ€. - μ½λ°± ν¬μ κ°λ μ±μ λμκ² νλ©° μ€μλ₯Ό μ λ°νλ μμ΄μ΄ λλ€.
- λ°μ μ½λλ μ½λ°± ν¬μ μμ μ΄λ€.
step1(function (value1) {
step2(value1, function (value2) {
step3(value2, function (value3) {
step4(value3, function (value4) {
step5(value4, function (value5) {
// value5λ₯Ό μ¬μ©νλ μ²λ¦¬
});
});
});
});
});- νλ‘λ―Έμ€λ
Promise μμ±μ ν¨μλ₯Ό ν΅ν΄μΈμ€ν΄μ€ννλ€. - Promise μμ±μ ν¨μλ λΉλκΈ° μμ
μ μνν μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ° μ΄ μ½λ°± ν¨μλ
resolveμrejectν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
// Promise κ°μ²΄μ μμ±
const promise = new Promise((resolve, reject) => {
// λΉλκΈ° μμ
μ μννλ€.
if (/* λΉλκΈ° μμ
μν μ±κ³΅ */) {
resolve('result');
}
else { /* λΉλκΈ° μμ
μν μ€ν¨ */
reject('failure reason');
}
});- Promiseλ λΉλκΈ° μ²λ¦¬κ°
μ±κ³΅(fullfilled)νμλμ§, λλμ€ν¨(rejected)νμλμ§ λ±μμν(state)μ 보λ₯Ό κ°λλ€. - Promise μν μ 보
- Promise μμ±μ ν¨μκ° μΈμλ‘ μ λ¬ λ°μ μ½λ°± ν¨μλ λ΄λΆμμ λΉλκΈ° μ²λ¦¬ μμ μ μννλ€.
- λΉλκΈ° μ²λ¦¬κ° μ±κ³΅νλ©΄ μ½λ°± ν¨μμ μΈμλ‘ μ λ¬λ°μ
resolveν¨μλ₯Ό νΈμΆνλ€. μ΄λ Promiseλfullfilledμνκ° λλ€. - λΉλκΈ° μ²λ¦¬κ° μ€ν¨νλ©΄
rejectν¨μλ₯Ό νΈμΆνλ€. μ΄λ Promiseλ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 λ©μλμ μΈμλ‘λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬νλ€. - λΉλκΈ° μ²λ¦¬μ μ€ν¨νλ©΄
rejectλ©μλλ₯Ό νΈμΆνλ€. μ΄λ reject λ©μλμ μΈμλ‘μλ¬ λ©μμ§λ₯Ό μ λ¬νλ€. - μΆκ°μ μΌλ‘ μμ μμ μμ XMLHttpRequestμ μμ±κ³Ό λ©μλλ₯Ό κ°λ¨νκ² μμ보면
- .open(method, url, async, username, passowrd): HTTP μμ²μ λν μμ±μ μ§μ νλ€.
1. method: νλΌλ―Έν° μ μ‘ λ°©λ²μ μ§μ , "GET" λλ "POST"λ‘ μ§μ ν μ μλ€.
2. url: HTTP μμ²μ λ³΄λΌ μ격 νμ΄μ§μ μ£Όμ.
3. async: μμ²μ λκΈ°, λΉλκΈ° μ²λ¦¬ν μ§μ μ¬λΆ trueμ΄λ©΄ λΉλκΈ°μ²λ¦¬, falseλ©΄ λκΈ°λ‘ μ²λ¦¬(μλ΅ κ°λ₯)
4. username, password: http μμ²μ λν μΈμ¦μ΄ νμν κ²½μ° μ§μ ν μ μλ κ³μ μ 보(μλ΅ κ°λ₯)
- .send(content): openμ μ§μ ν μμ±μ μ΄μ©νμ¬ HTTP μμ²μ μ μ‘νλ€.
1. content: HTTP μμ²κ³Ό ν¨κ» μ μ‘ν νλΌλ―Έν° λλ μ½ν
μΈ μ΄λ€.
- .setRequestHeader(key,value) : key/value μμ HTTP ν€λλ₯Ό μ μ‘ λͺ©λ‘μ λν©λλ€.
- .onreadystatechange: HTTPμμ²μ μν λ³νμ λ°λΌ νΈμΆλλ μ΄λ²€νΈ νΈλ€λ¬μ
λλ€.
1. 0 (UNSENT) : XMLHttpRequest κ°μ²΄κ° μμ±λ¨.
2. 1 (OPENED) : open() λ©μλκ° μ±κ³΅μ μΌλ‘ μ€νλ¨.
3. 2 (HEADERS_RECEIVED) : HTTP μμ²μ 보λ΄μ΄ μ²λ¦¬νκ³ μλ μ€. ν€λλ μ½μ μ μλ μν.
4. 3 (LOADING) : μμ²ν λ°μ΄ν°λ₯Ό μ²λ¦¬ μ€μ.
5. 4 (DONE) : μμ²ν λ°μ΄ν°μ μ²λ¦¬κ° μλ£λμ΄ μλ΅ν μ€λΉκ° μλ£λ¨. λΉλ‘μ responseText μ responseXML μμ±μ μ½μ μ μλ μν.
- .responseText : μμ²μ λν μλ΅μ ν
μ€νΈλ‘ λ°νν©λλ€.
- .responseXML : μ°κ²°μ λν μλ΅μ XML DOM μΌλ‘ λ³νν©λλ€. XML λ¬Έμμ΄μ΄ μλλΌ XML DOMμΌλ‘ λ°ννλ€λ κ²μ μΌλν΄ λμΈμ.
- .status : HTTP μν μ½λλ₯Ό μ«μλ‘ λ°νν©λλ€. μλ₯Ό λ€λ©΄ OKμ λν΄μ 200μ, νμ΄μ§λ₯Ό μ°Ύμμ μμμ λλ 404λ₯Ό λ°νν©λλ€.
- .statusText : HTTP μν μ½λμ λν λ¬Έμμ΄μ λ°νν©λλ€. μλ₯Ό λ€λ©΄ "OK", "Not Found" λ±μ΄ λ μ μμ΅λλ€.
- Promiseλ‘ κ΅¬νλ λΉλκΈ° ν¨μλ
Promise κ°μ²΄λ₯Ό λ°ννμ¬μΌ νλ€. - Promiseλ‘ κ΅¬νλ
λΉλκΈ° ν¨μλ₯Ό νΈμΆνλ μΈ‘(Promise consumer)μμλ Promise κ°μ²΄μνμ μ²λ¦¬ λ©μλ(then, catch)λ₯Ό ν΅ν΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Ό λλ μλ¬ λ©μμ§λ₯Ό μ λ¬λ°μ μ²λ¦¬νλ€. - Promise κ°μ²΄λ μνλ₯Ό κ°λ λ€κ³ νμλ€.
(fullfilled, rejected λ±)μ΄ μνμ λ°λΌ νμ μ²λ¦¬ λ©μλλ₯Όμ²΄μ΄λ λ°©μμΌλ‘ νΈμΆνλ€.
- then λ©μλλ λ κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ λ°λλ€.
- 첫 λ²μ§Έ μ½λ°± ν¨μλ
μ±κ³΅(fullfilled, resolve ν¨μκ° νΈμΆλ μν)μ νΈμΆλλ€. - λ λ²μ§Έ μ½λ°± ν¨μλ
μ€ν¨(rejected, reject ν¨μκ° νΈμΆλ μν)μ νΈμΆλλ€.
μμΈ(λΉλκΈ° μ²λ¦¬μμ λ°μν μλ¬μ then λ©μλμμ λ°μν μλ¬)κ° λ°μνλ©΄ νΈμΆλλ€.- catch λ©μλλ Promiseλ₯Ό λ°ννλ€.
promiseAjax("GET", "http://jsonplaceholder.typicode.com/posts/1")
.then(JSON.parse)
.then(
// 첫 λ²μ§Έ μ½λ°± ν¨μλ μ±κ³΅(fulfilled, resolve ν¨μκ° νΈμΆλ μν) μ νΈμΆλλ€.
render,
// λ λ²μ§Έ ν¨μλ μ€ν¨(rejected, reject ν¨μκ° νΈμΆλ μν) μ νΈμΆλλ€.
console.error
);- μμ μμ μμ promiseAjaxμ
Promise κ°μ²΄λ₯Ό λ°ννλ€. - Promise κ°μ²΄μ
νμ λ©μλ(then, catch)λ₯Ό μ¬μ©νμ¬ λΉλκΈ° μ²λ¦¬ κ²°κ³Όμ λν νμ μ²λ¦¬λ₯Ό μννλ€.
- λΉλκΈ° μ²λ¦¬ κ²°κ³Όμ λν νμ μ²λ¦¬λ Promise κ°μ²΄κ° μ 곡νλ
νμ μ²λ¦¬ λ©μλ(then, catch, finally)λ₯Ό μ¬μ©νμ¬ μννλ€κ³ λ§νλ€. - λΉλκΈ° μ²λ¦¬ μμ λ°μν μλ¬λ
then λ©μλμλ λ²μ§Έ μ½λ°± ν¨μλ‘ μ²λ¦¬ν μ μλ€.
const wrongUrl = "https://jsonplaceholder.typicode.com/XXX/1";
// λ λ²μ§Έ μ½λ°± ν¨μλ 첫 λ²μ§Έ μ½λ°± ν¨μμμ λ°μν μλ¬λ₯Ό μΊμΉνμ§ λͺ»νλ€.
promiseAjax("https://jsonplaceholder.typicode.com/todos/1").then(
(res) => console.xxx(res),
(err) => console.error(err)
);- νμ§λ§, thenμ λ λ²μ§Έ μ½λ°± ν¨μλ 첫 λ²μ§Έ μ½λ°± ν¨μμμ λ°μν μλ¬λ₯Ό μΊμΉ λͺ»νκ³ , μ½λκ° λ³΅μ‘ν΄μ Έμ κ°λ μ±μ μ’μ§ μλ€!
promiseAjax("https://jsonplaceholder.typicode.com/todos/1")
.then((res) => console.xxx(res))
.catch((err) => console.error(err)); // TypeError: console.xxx is not a function- catch λ©μλλ₯Ό
λͺ¨λ thenλ©μλλ₯Ό νΈμΆν μ΄νμ νΈμΆνλ€λ©΄,λΉλκΈ° μ²λ¦¬μμ λ°μνλ μλ¬(rejectν¨μκ° νΈμΆλ μν)λΏλ§ μλλΌthen λ©μλ λ΄λΆμμ λ°μν μλ¬κΉμ§ λͺ¨λ μΊμΉν μ μλ€. - λν, catch λ©μλλ₯Ό μ¬μ©νλ κ²μ΄ κ°λ
μ±μ΄ μ’κ³ λͺ
ννλ€. λ°λΌμ μλ¬ μ²λ¦¬λ then λ©μλμμ νμ§ λ§κ³
catch λ©μλλ₯Ό μ¬μ©νλ κ²μ κΆμ₯νλ€.
- λΉλκΈ° ν¨μμ μ²λ¦¬ κ²°κ³Όλ₯Ό κ°μ§κ³ λ€λ₯Έ λΉλκΈ° ν¨μλ₯Ό νΈμΆν΄μΌ νλ κ²½μ°, ν¨μμ νΈμΆμ΄
μ€μ²©(λ€μ€ν , nesting)λμ΄ λ³΅μ‘λκ° λμμ§λμ½λ°± ν¬μ΄ λ°μνλ€. - νλ‘λ―Έμ€λ νμ μ²λ¦¬ λ©μλλ₯Ό
체μ΄λ(chainning)νμ¬ μ¬λ¬ κ°μ νλ‘λ―Έμ€λ₯Ό μ°κ²°νμ¬ μ¬μ©ν μ μλ€. μ΄λ₯Ό ν΅ν΄ μ½λ°± ν¬μ ν΄κ²°νλ€. - Promise κ°μ²΄λ₯Ό λ°νν λΉλκΈ° ν¨μλ νλ‘λ―Έμ€ νμ μ²λ¦¬ λ©μλμΈ
thenμ΄λcatchλ©μλλ₯Ό μ¬μ©ν μ μλ€. - λ°λΌμ, then λ©μλκ° Promise κ°μ²΄λ₯Ό λ°ννλλ‘ νλ©΄(then λ©μλλ κΈ°λ³Έμ μΌλ‘ Promiseλ₯Ό λ°ννλ€.)
μ¬λ¬ κ°μ νλ‘λ―Έμ€λ₯Ό μ°κ²°νμ¬ μ¬μ©ν μ μλ€.
const url = "http://jsonplaceholder.typicode.com/posts";
// ν¬μ€νΈ idκ° 1μΈ ν¬μ€νΈλ₯Ό κ²μνκ³ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
promiseAjax("GET", `${url}/1`)
// ν¬μ€νΈ idκ° 1μΈ ν¬μ€νΈλ₯Ό μμ±ν μ¬μ©μμ μμ΄λλ‘ μμ±λ λͺ¨λ ν¬μ€νΈλ₯Ό κ²μνκ³ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
.then((res) => promiseAjax("GET", `${url}?userId=${JSON.parse(res).userId}`))
.then(JSON.parse)
.then(render)
.catch(console.error);- μ¬λ¬κ°μ λΉλκΈ° μμ
λ€μ΄ μ‘΄μ¬νκ³ μ΄λ€μ΄ λͺ¨λ μλ£λμμ λ, μμ
μ μ§ννκ³ μΆλ€λ©΄
Promise.allμ νμ©νλ©΄ λλ€. Promise.allλ©μλλ Promiseκ° λ΄κ²¨ μλ λ°°μ΄ λ±μμ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬ λ°λλ€.- μ λ¬λ°μ λͺ¨λ νλ‘λ―Έμ€λ₯Ό λ³λ ¬λ‘ μ²λ¦¬νκ³ κ·Έ μ²λ¦¬ κ²°κ³Όλ₯Ό resolveνλ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννλ€.
Promise.all([
new Promise((resolve) => setTimeout(() => resolve(1), 3000)), // 1
new Promise((resolve) => setTimeout(() => resolve(2), 2000)), // 2
new Promise((resolve) => setTimeout(() => resolve(3), 1000)), // 3
])
.then(console.log) // [ 1, 2, 3 ]
.catch(console.log);- μμ μ½λλ₯Ό μ΄ν΄λ³΄λ©΄
λͺ¨λ Promiseμ μ²λ¦¬κ° μ±κ³΅νλ©΄ κ°κ°μ νλ‘λ―Έμ€κ° resolveν μ²λ¦¬ κ²°κ³Όλ₯Όλ°°μ΄μ λ΄μ resolveνλμλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννλ€. - μ΄λ, 첫λ²μ§Έ νλ‘λ―Έμ€κ° κ°μ₯ λμ€μ μ²λ¦¬λλλΌλ Promise.all λ©μλκ° λ°ννλ νλ‘λ―Έμ€λ 첫λ²μ§Έ νλ‘λ―Έμ€κ° resolveν μ²λ¦¬ κ²°κ³ΌλΆν° μ°¨λ‘λλ‘ λ°°μ΄μ λ΄λλ€. κ·Έλ¦¬κ³ κ·Έ λ°°μ΄μ resolveνλ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ννλ€. μ¦,
μ²λ¦¬ μμκ° λ³΄μ₯λλ€.
https://babtingdev.tistory.com/45 https://poiemaweb.com/es6-promise https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise https://ko.javascript.info/promise-basics