ES6
μμ λΉλκΈ° μ²λ¦¬λ₯Ό μν λ λ€λ₯Έ ν¨ν΄μΌλ‘νλ‘λ―Έμ€(Promise)λ₯Ό λμ
- νλ‘λ―Έμ€λ μ ν΅μ μΈ μ½λ°± ν¨ν΄μ΄ κ°μ§
μ½λ°±μ§μ₯μ κ°λ μ± λ¬Έμ μ μλ¬ μ²λ¦¬κ° κ³€λνλ€λ λ¨μ μ 보μ
λΉλκΈ° μ²λ¦¬ μμ μ λͺ ννκ² ννν μ μλ€λ μ₯μ μ΄ μλ€.
λΉλκΈ° ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λμμ μ²λ¦¬ κ²°κ³Όλ₯Ό μΈλΆλ‘ λ°ννκ±°λ μμ μ€μ½νμ λ³μμ ν λΉνλ©΄ κΈ°λν λλ‘ λμνμ§ μλλ€.
- λΉλκΈ° ν¨μλ₯Ό νΈμΆνλ©΄ ν¨μ λ΄λΆμ λΉλκΈ°λ‘ λμνλ μ½λκ° μλ£λμ§ μμλ€ ν΄λ κΈ°λ€λ¦¬μ§ μκ³
μ¦μ μ’ λ£
λκΈ° λλ¬Έ
let g = 0;
// setTimeout λΉλκΈ° ν¨μμ μ½λ°± ν¨μμμ μ μ λ³μ gμ κ°μ΄ λ³κ²½λκΈΈ κΈ°λ
// μ€μ λ‘λ λ³μ gμ κ°μ λ³κ²½λμ§ μλλ€.
// setTimeout μ μ½λ°±ν¨μκ° μ½ μ€νμΌλ‘ μ΄λν΄μ μ€νλλ μμ μλ μ΄λ―Έ console.log ν¨μκ° λλ μμ μ΄κΈ° λλ¬Έ
setTimeout(() => {
g = 100;
}, 0);
console.log(g); // 0
λ°λΌμ,
λΉλκΈ° ν¨μμ μ²λ¦¬ κ²°κ³Ό(λνμ μΌλ‘, μλ²μ μλ΅ λ±)μ λν νμ μ²λ¦¬λ λΉλκΈ° ν¨μ λ΄λΆμμ μνν΄μΌ νλ€.
- μ΄λ νμ μ²λ¦¬λ₯Ό μν λΉλκΈ° ν¨μλ₯Ό
μ½λ°± ν¨μλ‘ μ λ¬
νλ κ²μ΄ μΌλ°μ - νμμ λ°λΌ,
λΉλκΈ° μ²λ¦¬κ° μ±κ³΅νλ©΄ νΈμΆλ μ½λ°± ν¨μ
μλΉλκΈ° μ²λ¦¬κ° μ€ν¨νλ©΄ νΈμΆλ μ½λ°± ν¨μλ₯Ό μ λ¬
νλ κ²
// GET μμ²μ μν λΉλκΈ° ν¨μ
// μμ² κ²°κ³Όμ λ°λΌ μνν μ±κ³΅,μ€ν¨ μ½λ°± ν¨μ μ λ¬
const get = (url, successCallback, failureCallback) => {
const xhr = new XMLHttpRequest();
xhr.open();
xhr.send("GET", url);
xhr.onload = () => {
if (xhr.status === 200) {
successCallback(JSON.parse(xhr.response));
} else {
failureCallback(xhr.status);
}
};
};
get("https://jsonplaceholder.typicode.com/posts/1", console.log, console.error);
// {
// userId: 1,
// id: 1,
// title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
// body: 'quia et suscipit\nsuscipit recusandae consequuntur β¦strum rerum est autem sunt rem eveniet architecto'
// };
λ€λ§, μ΄λ°μμΌλ‘ νμ μ²λ¦¬μ νμν λΉλκΈ° ν¨μλ₯Ό μ½λ°± ν¨μλ‘ μ λ¬νκ³ νΈμΆνλ λ°©μμ΄
μ€μ²©λλ©΄ 볡μ‘λκ° λμμ§λ νμμ΄ λ°μ
βμ½λ°±μ§μ₯(callback hell)
...
get("/step1", (a) => {
get(`/step2/${a}`, (b) => {
get(`/step3/${b}`, (c) => {
get(`/step4/${c}`, (d) => {
console.log(d);
});
});
});
});
λν, μ½λ°± ν¨ν΄μ λ¬Έμ μ μ€ κ°μ₯ μ¬κ°ν κ²μ
μλ¬ μ²λ¦¬κ° κ³€λ
νλ€λ κ²
μλ¬λ νΈμΆμ(caller)λ°©ν₯μΌλ‘ μ νλλ€.
- μ¦, νμ¬ μ€ν μ€μΈ μ€ν 컨ν μ€νΈκ° νΈμλκΈ° μ§μ μ νΈμλ μ€ν 컨ν μ€νΈ λ°©ν₯μΌλ‘ μ νλλ€.
try {
setTimeout(() => {
throw new Error("Error!");
}, 1000);
} catch (error) {
// μ΄λ²€νΈ νμμ μ½ μ€νμΌλ‘ setTimeout μ μ½λ°± ν¨μλ‘ μ΄λλμ΄ μ€νλλ μμ μμ setTimout ν¨μλ μ΄λ―Έ, μ½ μ€νμμ popλ μνμ΄κ³ μ£Όμ²΄κ° μλλ€.
// μ½λ°± ν¨μμ νΈμΆμ(caller)κ° setTimeout μΈλ°, μλ¬ λ°μ μμ μ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ Error λ₯Ό μΊμΉν μ μλ€.
console.error("μΊμΉ μλ¬ :", error);
}
Promise μμ±μ ν¨μλ₯Ό new ν€μλμ ν¨κ» νΈμΆ
νλ―λ‘μ¨ νλ‘λ―Έμ€(Promise κ°μ²΄
)λ₯Ό μμ±
- νλ‘λ―Έμ€λ νΈμ€νΈ κ°μ²΄κ° μλ ECAMScript μ¬μμ μ μλ
νμ€ λΉνΈμΈ κ°μ²΄
- Promise μμ±μ ν¨μλ
λΉλκΈ° μ²λ¦¬λ₯Ό μνν μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬ λ°λλ€.
resolve
μreject ν¨μ
λ₯Ό μΈμλ‘ μ λ¬
const promise = new Promise((resovle, reject) => { if(λΉλκΈ° μ²λ¦¬ μ±κ³΅) { resolve('result'); } else { reject('failure Error'); } })
- νλ‘λ―Έμ€λ
νμ¬ λΉλκΈ° μ²λ¦¬κ° μ΄λ»κ² μ§νλκ³ μλμ§
λ₯Ό λνλ΄λμν(state)μ 보
λ₯Ό κ°μ§λ€.νλ‘λ―Έμ€ μν μ 보 μλ―Έ μν λ³κ²½ 쑰건 pending λΉλκΈ° μ²λ¦¬κ° μμ§ μνλμ§ μμ μν νλ‘λ―Έμ€κ° μμ±λ μ§ν κΈ°λ³Έ μν fulfilled λΉλκΈ° μ²λ¦¬κ° μνλ μν( μ±κ³΅ ) resolve ν¨μ νΈμΆ rejected λΉλκΈ° μ²λ¦¬κ° μνλ μν( μ€ν¨ ) reject ν¨μ νΈμΆ - κΈ°λ³Έμ μΌλ‘λ
pending μνμ΄λ©°, μ΄ν λΉλκΈ° μ²λ¦¬κ° μνλλ©΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Όμ λ°λΌ νλ‘λ―Έμ€ μνκ° λ³κ²½
- λΉλκΈ° μ²λ¦¬ μ±κ³΅ β resolve ν¨μλ₯Ό νΈμΆ β νλ‘λ―Έμ€λ₯Ό fulfilled μνλ‘ λ³κ²½
- λΉλκΈ° μ²λ¦¬ μ€ν¨ β reject ν¨μλ₯Ό νΈμΆ β νλ‘λ―Έμ€λ₯Ό rejected μνλ‘ λ³κ²½
- μ¦,
νλ‘λ―Έμ€ μνλ resolve λλ reject ν¨μλ₯Ό νΈμΆνλ κ²μΌλ‘ κ²°μ
- rejected λλ fulfilled μνλ₯Ό
settled μν
λΌκ³ νλ€.- μ¦, settled μνλ λΉλκΈ° μ²λ¦¬κ° μνλ μνλ₯Ό μλ―Έ
- ν λ² settled μνκ° λλ©΄ λλ λ€λ₯Έ μνλ‘ λ³νν μ μλ€.
- κΈ°λ³Έμ μΌλ‘λ
- νλ‘λ―Έμ€λ
λΉλκΈ° μ²λ¦¬ μνμ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ μνλ‘ κ°λλ€.
const fulfilled = new Promise((resolve) => resolve(1)); console.log(fulfilled); /* [[Prototype]]: Promise [[PromiseState]]: "fulfilled" [[PromiseResult]]: 1 */ const rejected = new Promise((_, reject) => reject(new Error("failure Error"))); console.log(rejected); /* [[Prototype]]: Promise [[PromiseState]]: "rejected" [[PromiseResult]]: Error: failure Error */
νλ‘λ―Έμ€μ
λΉλκΈ° μ²λ¦¬ μνκ° λ³κ²½λλ©΄, μ΄μ λ°λ₯Έ νμ μ²λ¦¬λ₯Ό ν΄μΌ νλ€.
- νλ‘λ―Έμ€κ°
fulfilled μνκ° λλ©΄
β νλ‘λ―Έμ€μμ²λ¦¬ κ²°κ³Όλ₯Ό κ°μ§κ³ 무μΈκ°λ₯Ό μν
- νλ‘λ―Έμ€κ°
rejected μνκ° λλ©΄
β νλ‘λ―Έμ€μμ²λ¦¬ κ²°κ³Ό(μλ¬)λ₯Ό κ°μ§κ³ μλ¬ μ²λ¦¬λ₯Ό μν
νλ‘λ―Έμ€μ λΉλκΈ° μ²λ¦¬ μνκ° λ³ννλ©΄,
νμ μ²λ¦¬ λ©μλμ μΈμλ‘ μ λ¬ν μ½λ°± ν¨μκ° μ νμ μΌλ‘ νΈμΆ
λλ€.
- μ΄λ₯Ό μν΄, νλ‘λ―Έμ€λ νμ μ²λ¦¬ λ©μλ
then, catch, finally
λ₯Ό μ 곡
λ κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
- 첫 λ²μ§Έ μ½λ°± ν¨μ β νλ‘λ―Έμ€κ° fulfilled μν(resolve ν¨μκ° νΈμΆλ μν)κ° λλ©΄ νΈμΆ, μ½λ°± ν¨μλ νλ‘λ―Έμ€μ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μΈμλ‘ μ λ¬λ°μ
- λ λ²μ§Έ μ½λ°± ν¨μ β νλ‘λ―Έμ€κ° rejected μν(reject ν¨μκ° νΈμΆλ μν)κ° λλ©΄ νΈμΆ, μ½λ°± ν¨μλ νλ‘λ―Έμ€μ μλ¬λ₯Ό μΈμλ‘ μ λ¬λ°μ
new Promise((resolve) => resolve("fulfilled")).then(
(v) => console.log(v),
(e) => console.error(e),
);
// fulfilled
new Promise((_, reject) => reject(new Error("rejected"))).then(
(v) => console.log(v),
(e) => console.error(e),
);
// Error: rejected
then λ©μλλ μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°ν
- then λ©μλμ μ½λ°± ν¨μκ° νλ‘λ―Έμ€λ₯Ό λ°ννλ©΄ κ·Έ νλ‘λ―Έμ€λ₯Ό κ·Έλλ‘ λ°ν
κ°μ λ°ν
νλ©΄ κ·Έ κ°μμ묡μ μΌλ‘ resolve λλ reject νμ¬ νλ‘λ―Έμ€λ₯Ό μμ±ν΄ λ°ν
ν κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
- νλ‘λ―Έμ€κ°
rejected μν(reject ν¨μκ° νΈμΆλ μν)μΈ κ²½μ°λ§ νΈμΆ
- catch λ©μλλ then(undefined, onRejected) κ³Ό λμΌνκ² λμ
catch λ©μλλ μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°ν
new Promise((_, reject) => reject(new Error("rejected"))).catch((e) => console.log(e)); // Error: rejected
// μμ catch λ¬Έκ³Ό κ°μ κΈ°λ₯μ νλ then λ²μ
new Promise((_, reject) => reject(new Error("rejected"))).then(undefined, (e) => console.log(e)); // Error: rejected
ν κ°μ μ½λ°± ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ€.
- νλ‘λ―Έμ€μ
μ±κ³΅ λλ μ€ν¨μ μκ΄μμ΄ λ¬΄μ‘°κ±΄ ν λ² νΈμΆλλ€.
- νλ‘λ―Έμ€μ μνμ μκ΄μμ΄
곡ν΅μ μΌλ‘ μνν΄μΌ ν μ²λ¦¬ λ΄μ©μ΄ μμ λ μ μ©
finally λ©μλλ μΈμ λ νλ‘λ―Έμ€λ₯Ό λ°ν
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));
}
};
});
};
promiseGET("https://jsonplaceholder.typicode.com/posts/1")
.then((res) => console.log(res))
.catch((err) => console.log(err))
.finally(() => console.log("End !"));
// {
// userId: 1,
// id: 1,
// title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',
// body: 'quia et suscipit\nsuscipit recusandae consequuntur β¦strum rerum est autem sunt rem eveniet architecto'
// }
// End !
λ κ°μ§ λ°©λ²μ΄ μλ€.
then λ©μλμ λ λ²μ§Έ μ½λ°± ν¨μλ‘ μ²λ¦¬νλ λ°©λ²
- then λ©μλλ λ κ°μ μ½λ°± ν¨μλ₯Ό μ λ¬ λ°λλ€κ³ νλ€.
- μ¦, then(μ±κ³΅ μ, μ€ν¨ μ)λ₯Ό μλ―Ένλ€.
- λ°λΌμ, then(_ , onRejected)μ ννλ‘ νΈμΆνλ©΄ μλ¬ μ²λ¦¬ κ°λ₯
const promiseGET = (url) => { ... } const wrongURL = "https://wrongURL.com"; // then λ©μλ λ λ²μ§Έ νλΌλ―Έν°λ‘ μλ¬ μΊμΉ λ©μλλ₯Ό λκΈ°λ λ°©μ promiseGET(wrongURL).then( (res) => console.log(res), (err) => console.log(err), );
catch λ©μλλ‘ μ²λ¦¬νλ λ°©λ²
const promiseGET = (url) => { ... } // catch λ©μλλ₯Ό μ¬μ©νλ λ°©μ promiseGET(wrongURL) .then((res) => console.log(res)) .catch((err) => console.log(err)); // catch λ©μλλ λ΄λΆμ μΌλ‘ λ€μκ³Ό κ°λ€. promiseGET(wrongURL) .then((res) => console.log(res)) .then(undefined, (err) => console.log(err));
λ€λ§, μΌλ°μ μΌλ‘
νλ‘λ―Έμ€μ μλ¬ μ²λ¦¬λ catch λ©μλλ‘ μ²λ¦¬νλ€.
- then λ©μλμ λ λ²μ§Έ μΈμλ‘ μλ¬ μ²λ¦¬ μ½λ°± ν¨μμμ λ°μν μλ¬λ
μΊμΉνμ§ λͺ»νκ³ μ½λκ° λ³΅μ‘ν΄μ Έ κ°λ μ±λ μ’μ§ μλ€λ λ¨μ μ΄ μ‘΄μ¬
νκΈ° λλ¬Έ
νλ‘λ―Έμ€ μ²΄μ΄λ(Promise chainning)
: then, catch, finally νμ μ²λ¦¬ λ©μλλ μΈμ λνλ‘λ―Έμ€(Promise κ°μ²΄)λ₯Ό λ°ννκΈ° λλ¬Έμ
,μ°μμ μΌλ‘ νΈμΆ(체μ΄λ)μ΄ κ°λ₯
- νλ‘λ―Έμ€λ νλ‘λ―Έμ€ μ²΄μ΄λμ ν΅ν΄ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬λ°μ νμ μ²λ¦¬λ₯Ό νλ―λ‘ λΉλκΈ° μ²λ¦¬λ₯Ό μν μ½λ°± ν¨ν΄μ λ¬Έμ μλ μ½λ°±μ§μ₯μ΄ λ°μνμ§ μλλ€.
- λ€λ§, νλ‘λ―Έμ€λ μ½λ°± ν¨ν΄μ μ¬μ©νλ―λ‘ μ½λ°± ν¨μλ₯Ό μμ μ¬μ©νμ§ μλ κ²μ μλλ€.
μ½λ°± ν¨ν΄μ κ°λ μ±μ΄ μ’μ§ μλ€.
- μ΄ λ¬Έμ λ₯Ό
ES8
μ λμ λasync / await λ₯Ό ν΅ν΄ ν΄κ²° κ°λ₯νλ€.
- νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλ μμ΄ λ§μΉ
λκΈ° μ²λ¦¬
μ²λΌ νλ‘λ―Έμ€κ° μ²λ¦¬ κ²°κ³Όλ₯Ό λ°ννλλ‘ κ΅¬ν κ°λ₯
const promiseGET = (url) => { ... } const url = "https://jsonplaceholder.typicode.com"; (async () => { const { userId } = await promiseGET(`${url}/posts/1`); const userInfo = await promiseGET(`${url}/users${userId}`); console.log(userInfo); })();
- νλ‘λ―Έμ€μ νμ μ²λ¦¬ λ©μλ μμ΄ λ§μΉ
Promise λ μμ±μ ν¨μ, μ¦ ν¨μλ κ°μ²΄μ΄λ―λ‘ λ©μλλ₯Ό κ°μ§λ€.
- 5κ°μ§ μ μ λ©μλλ₯Ό μ 곡
μ΄λ―Έ μ‘΄μ¬νλ κ°μ λννμ¬ νλ‘λ―Έμ€λ₯Ό μμ±νκΈ° μν΄ μ¬μ©
- Promise.resolve β μΈμλ‘ μ λ¬λ°μ κ°μ resolve νλ νλ‘λ―Έμ€λ₯Ό μμ±
const resolvedPromise = Promise.resolve([1, 2, 3]); // const resolvedPromise = new Promise((resolve) => resolve([1, 2, 3])); resolvedPromise.then((v) => console.log(v)); // [ 1, 2, 3 ]
- Promise.reject β μΈμλ‘ μ λ¬λ°μ κ°(μλ¬)μ reject νλ νλ‘λ―Έμ€λ₯Ό μμ±
const rejectedPromise = Promise.reject(new Error("Error !")); // const rejectedPromise = new Promise((_, reject) => reject(new Error("Error !"))); rejectedPromise.catch((err) => console.log(err)); // Error: Error !
μ¬λ¬ κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό λͺ¨λ
λ³λ ¬(parallel)μ²λ¦¬
ν λ μ¬μ©
- μλ‘ λ
립μ μΈ μ¬λ¬ λΉλκΈ° μ²λ¦¬λ₯Ό Promise.prototype.then νμ μ²λ¦¬ λ©μλλ‘ μ²΄μ΄λ νλ κ²½μ°
const req1 = () => new Promise((resolve) => setTimeout(() => resolve(1), 3000)); const req2 = () => new Promise((resolve) => setTimeout(() => resolve(2), 2000)); const req3 = () => new Promise((resolve) => setTimeout(() => resolve(3), 1000)); const res = []; req1() .then((data) => { res.push(data); return req2(); }) .then((data) => { res.push(data); return req3(); }) .then((data) => { res.push(data); console.log(res); }) .catch((err) => console.log(err)); // μ½ 6μ΄ λ€.. // [ 1, 2, 3 ]
- μλ‘ λ
립μ μΈ μ¬λ¬ λΉλκΈ° μ²λ¦¬λ₯Ό Promise.all μ μ λ©μλλ‘ μ²λ¦¬νλ κ²½μ°
const req1 = () => new Promise((resolve) => setTimeout(() => resolve(1), 3000)); const req2 = () => new Promise((resolve) => setTimeout(() => resolve(2), 2000)); const req3 = () => new Promise((resolve) => setTimeout(() => resolve(3), 1000)); Promise.all([req1(), req2(), req3()]) .then((res) => console.log(res)) .catch((err) => console.log(err)); // μ½ 3μ΄ λ€.. ( κ°μ₯ μ€λ 걸리λ λΉλκΈ° μ²λ¦¬κ° 3000ms(μ½ 3μ΄)) // [ 1, 2, 3 ]
- Promise.all λ©μλλ
νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°λλ€.
- μ λ¬λ°μ λͺ¨λ νλ‘λ―Έμ€κ°
λͺ¨λ fulfilled μνκ° λλ©΄ λͺ¨λ μ²λ¦¬ κ²°κ³Όλ₯Ό λ°°μ΄μ μ μ₯ν΄ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ν
- Promise.all λ©μλκ° μ’ λ£νλ λ° κ±Έλ¦¬λ μκ° = κ°μ₯ λ¦κ² fulfilled μνκ° λλ νλ‘λ―Έμ€μ μ²λ¦¬ μκ° + a μκ°
μμκ° λ³΄μ₯λλ€.
- κ°μ₯ λ¦κ² fulfilled λλ νλ‘λ―Έμ€κ° λ°°μ΄ μμμ μμ μμ΄λ, μμλλ‘ λ°°μ΄μ μ μ₯ ν μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ν
- μ λ¬λ°μ νλ‘λ―Έμ€ μμλ€ μ€,
νλλΌλ rejected μνκ° λλ©΄ λλ¨Έμ§ νλ‘λ―Έμ€μ μ§ν μνμ μκ΄μμ΄ κΈ°λ€λ¦¬μ§ μκ³ μ¦μ μ’ λ£
const req1 = () => new Promise((_, reject) => setTimeout(() => reject(new Error("Error 1")), 3000)); const req2 = () => new Promise((_, reject) => setTimeout(() => reject(new Error("Error 2")), 2000)); const req3 = () => new Promise((_, reject) => setTimeout(() => reject(new Error("Error 3")), 1000)); Promise.all([req1(), req2(), req3()]) .then((res) => console.log(res)) .catch((err) => console.log(err)); // μ½ 1μ΄ λ€.. // Error: Error 3 << λͺ¨λ νλ‘λ―Έμ€ μμ μ€ κ°μ₯ λΉ λ₯΄κ² rejected λλ νλ‘λ―Έμ€μ reject ν¨μλ₯Ό νΈμΆ
- μ λ¬λ°μ μ΄ν°λ¬λΈμ
μμλ€μ΄ νλ‘λ―Έμ€κ° μλ κ°μΈ κ²½μ°, Promise.resolve λ©μλλ₯Ό ν΅ν΄ νλ‘λ―Έμ€λ‘ λννλ€.
Promise.all([1, 2, 3]) .then((res) => console.log(res)) .catch((err) => console.log); // [ 1, 2, 3 ]
Promise.all λ©μλμ λμΌνκ² νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°λλ€.
- λ€λ§, Promise.all λ©μλμ²λΌ λͺ¨λ νλ‘λ―Έμ€ μμλ€μ΄ fulfilled λ λκΉμ§ κΈ°λ€λ¦¬μ§ μκ³ ,
κ°μ₯ λ¨Όμ fulfilled μνκ° λλ νλ‘λ―Έμ€μ μ²λ¦¬ κ²°κ³Όλ₯Ό resolve νλ μλ‘μ΄ νλ‘λ―Έμ€λ₯Ό λ°ν
const req1 = () => new Promise((resolve) => setTimeout(() => resolve(1), 3000));
const req2 = () => new Promise((resolve) => setTimeout(() => resolve(2), 2000));
const req3 = () => new Promise((resolve) => setTimeout(() => resolve(3), 1000));
Promise.race([req1(), req2(), req3()])
.then((res) => console.log(res))
.catch((err) => console.log(err));
// μ½ 1μ΄ λ€.. ( κ°μ₯ λ¨Όμ fulfilled μνκ° λλ νλ‘λ―Έμ€ μ²λ¦¬ κ²°κ³Όλ₯Ό resolve ν¨μ νΈμΆλ‘ νλ‘λ―Έμ€ λ°ν )
// 3
// λλ¨Έμ§ μ½ 2μ΄ λ€, μ’
λ£ ( κ°μ₯ μ€λ 걸리λ νλ‘λ―Έμ€ κΈ°μ€ )
ES11
μ λμ , μ λ¬λ°μ νλ‘λ―Έμ€κ° λͺ¨λsettled μν(= λΉλκΈ° μ²λ¦¬κ° μνλ μν)κ° λλ©΄, μ²λ¦¬ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°ν
- νλ‘λ―Έμ€κ° fulfilled μνμΈ κ²½μ° β
{ status, value }
νλ‘νΌν°λ₯Ό κ°λλ€. - νλ‘λ―Έμ€κ° rejected μνμΈ κ²½μ° β
{ status, reason }
νλ‘νΌν°λ₯Ό κ°λλ€. - νλ‘λ―Έμ€λ₯Ό μμλ‘ κ°λ λ°°μ΄ λ±μ μ΄ν°λ¬λΈμ μΈμλ‘ μ λ¬λ°λλ€.
const resolvedPromise = new Promise((resolve) => setTimeout(() => resolve(1), 2000));
const rejectedPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Error !"), 1000)));
Promise.allSettled([resolvedPromise, rejectedPromise]).then((res) => console.log(res));
// [
// { status: 'fulfilled', value: 1 },
// {
// status: 'rejected',
// reason: Error: Error !
// at Timeout._onTimeout (C:\Users\forze\Desktop\Docs-modernJS__deepDive\37-Promise\index.js:2:76)
// at listOnTimeout (node:internal/timers:556:17)
// at processTimers (node:internal/timers:499:7)
// }
// ]
setTimeout(() => console.log(1), 0);
Promise.resolve()
.then(() => console.log(2))
.then(() => console.log(3));
// 2 3 1
- μμ μμ μ κ²°κ³Όλ 1 β 2 β 3 μ΄ μλ,
2 β 3 β 1 μ
μΌλ‘ μΆλ ₯λλ€.
κ·Έ μ΄μ λ,
νλ‘λ―Έμ€ νμ μ²λ¦¬ λ©μλμ μ½λ°± ν¨μλ
νμ€ν¬ ν(task queue, = event queue)κ° μλλ§μ΄ν¬λ‘νμ€ν¬ ν(microtask queue, = job queue)μ μ μ₯λλ€.
- λ§μ΄ν¬λ‘νμ€ν¬ νλ νμ€ν¬ νμλ λΈλΌμ°μ μμ μ 곡νλ
λ³λμ νλ€.
λ§μ΄ν¬λ‘νμ€ν¬ ν(= μ‘ ν) β νλ‘λ―Έμ€ νμ μ²λ¦¬ λ©μλμ μ½λ°± ν¨μκ° μΌμμ μΌλ‘ 보κ΄
νμ€ν¬ ν(= μ΄λ²€νΈ ν) β κ·Έ μΈμ λΉλκΈ° ν¨μμ μ½λ°± ν¨μλ μ΄λ²€νΈ νΈλ€λ¬κ° μΌμμ μΌλ‘ 보κ΄
μ°μ μμ = λ§μ΄ν¬λ‘νμ€ν¬ ν > νμ€ν¬ ν
- μ¦, μ΄λ²€νΈ 루νλ μ½ μ€νμ΄ λΉλ©΄ λ¨Όμ λ§μ΄ν¬λ‘νμ€ν¬ νμμ λκΈ°νκ³ μλ ν¨μλ₯Ό κ°μ Έμ μ€ν
- μ΄ν λ§μ΄ν¬λ‘νμ€ν¬ νκ° λΉλ©΄ νμ€ν¬ νμμ λκΈ°νκ³ μλ ν¨μλ₯Ό κ°μ Έμ μ€ν
XMLHttpRequest κ°μ²΄μ λ§μ°¬κ°μ§λ‘
HTTP μμ² μ μ‘ κΈ°λ₯μ μ 곡
νλν΄λΌμ΄μΈνΈ μ¬μ΄λ Web API
- XTMLHttpRequest κ°μ²΄λ³΄λ€ μ¬μ©λ²μ΄ κ°λ¨νλ©°, νλ‘λ―Έμ€λ₯Ό μ§μνκΈ° λλ¬Έμ λΉλκΈ° μ²λ¦¬λ₯Ό μν μ½λ°± ν¨ν΄μμ μμ λ‘λ€.
const promise = fetch(url [, options]);
fetch ν¨μλ HTTP μλ΅μ λνλ΄λ
Response κ°μ²΄λ₯Ό λνν Promise κ°μ²΄λ₯Ό λ°ν
fetch("https://jsonplaceholder.typicode.com/todos/1").then((res) => console.log(res));
// Response
// {
// type: 'cors',
// url: 'https://jsonplaceholder.typicode.com/todos/1',
// redirected: false,
// status: 200,
// ok: true,
// β¦
// }
- Response κ°μ²΄μ
Response.prototype
μλ Response κ°μ²΄μ ν¬ν¨λμ΄ μλHTTP μλ΅ λͺΈμ²΄λ₯Ό μν λ€μν λ©μλλ₯Ό μ 곡νλ€.
Response.prototpye.json λ©μλ
: fetch ν¨μκ° λ°νν νλ‘λ―Έμ€κ° λννκ³ μλMIME νμ μ΄ application/json μΈ HTTP μλ΅ λͺΈμ²΄λ₯Ό μ·¨λ
- Response κ°μ²΄μμ HTTP Response Bodyλ₯Ό μ·¨λνμ¬
μμ§λ ¬ν(deserializing)
νλ€. (μλ² μλ΅ λ°μ΄ν° νλ
)
- Response κ°μ²΄μμ HTTP Response Bodyλ₯Ό μ·¨λνμ¬
// HTTP Request(μμ²) λͺ¨μ κ°μ²΄ μμ±
const request = {
get(url) {
return fetch(url);
},
post(url, payload) {
return fetch(url, {
method: "POST",
headers: { "content-Type": "application/json " },
body: JSON.stringify(payload),
});
},
patch(url, payload) {
return fetch(url, {
method: "PATCH",
headers: { "content-Type": "application/json " },
body: JSON.stringify(payload),
});
},
delete(url) {
return fetch(url, { method: "DELETE " });
},
};
const url = "HTTP ν΅μ μμ²ν url";
// GET μμ
request
.get(url)
.then((res) => res.json())
.then((data) => console.log(data));
// POST μμ
request
.post(url, { obj })
.then((res) => res.json())
.then((data) => console.log(data))
.catch((err) => console.error(err));
// PATCH μμ
request
.patch(url, { obj })
.then((res) => res.json())
.then((data) => console.log(data))
.catch((err) => console.error(err));
// DELETE μμ
request
.delete(url, { obj })
.then((res) => res.json())
.then((data) => console.log(data))
.catch((err) => console.error(err));