μ΄μ κΈμμ μ΄ν΄λ΄€λ― μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λλ‘ λμνλ μΈμ΄λ‘μ νλ²μ νλμ μμ λ§ μνν μ μλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μλ°μ€ν¬λ¦½νΈμ λ°νμ νκ²½μ λμμ λ°μ λΉλκΈ° μμ μ μνν¨μΌλ‘μ¨
μ±κΈμ€λ λ-λ ΌλΈλ‘νΉ λͺ¨λΈμ ꡬνν μ μκ² λμλ€.
μ΄μ λΆν° λ°νμ νκ²½μ΄ μ΄λ»κ² λΉλκΈ°λ₯Ό μ²λ¦¬νλμ§ μμ보μ.
μ½λ°± ν¨μλ λ§ κ·Έλλ‘ λμ€μ νΈμΆλλ ν¨μλ€. λ Έλλ μ΄λ²€νΈ κΈ°λ°(event-driven) λ°©μμΌλ‘ λμνκΈ° λλ¬Έμ, μ΄λ²€νΈκ° λ°μνλ©΄ μ΄λ²€νΈ 리μ€λμ λ±λ‘ν΄λ μ½λ°± ν¨μλ₯Ό νΈμΆνλ€. ν΄λΉ λμμ΄ μλ£λ λ κΉμ§ μ§μ κΈ°λ€λ¦΄ νμ μμ΄ λμμ μ€νμμΌ λκ³ , μλ£λμ λ κ²°κ³Όλ₯Ό λ°λ νμμ΄λ€.νΈμΆλ μ½λ°± ν¨μλ libuvμ event queueλ‘ λμ΄κ°κ³ μ΄λ²€νΈ 루ν, μ½λ°± νλ₯Ό κ±°μ³ μ΅μ’ μλ΅μ νλ€.
λ¨μν μ½λ°± μ²λ¦¬λΌλ©΄ λ¬Έμ κ° μκ² μ§λ§, μ€μ μ½λλ₯Ό μμ±ν λ μ€ν μμλ₯Ό μ κ²½ μ¨μΌνλ μν©μ΄ λλΆλΆμ΄λ€.
μ΄λ΄λ λ§λ€ μ½λ°±μ΄ μ€μ²©λλ€λ©΄ μ½λμ κΉμ΄κ° κ³μν΄μ κΉμ΄μ§λ μ°Έμ¬κ° λ°μνλ€.
λ€μ μ½λλ₯Ό 보μ. [μ½λ μΆμ²]
function νμμ 보_μ‘°ν(νμ_νλ², callback1) {
ajax(
baseUrl + "student-info/" + νμ_νλ², function (response) {
callback1(response);
});
}
function κ³ κ΅μ£Όμ_μ‘°ν(κ³ κ΅λͺ
, callback2) {
ajax(
baseUrl + "highschoolDB/" + κ³ κ΅λͺ
, function (response) {
callback2(response);
});
}
function κ³ κ΅_μμ
_μ‘°ν(κ³ κ΅_DB_μ£Όμ, callback3) {
ajax(
baseUrl + "classes/" + κ³ κ΅_DB_μ£Όμ, function (response) {
callback3(response);
});
}
function μμ
_μ 보_μ‘°ν(κ³ 3_μνμμ
_μ½λ, callback4) {
ajax(
baseUrl + "class-info/" + κ³ 3_μνμμ
_μ½λ, function (response) {
callback4(response);
});
}
function κ³ 3_μνκ΅μ¬_μ°ΎκΈ°(νμ_νλ²) {
νμμ 보_μ‘°ν(νμ_νλ²,
function(νμμ 보) {
let νμμ£Όλ―Όλ²νΈ = νμμ 보["μ£Όλ―Όλ²νΈ"];
let κ³ κ΅λͺ
= νμμ 보["κ³ λ±νκ΅λͺ
"];
κ³ κ΅μ£Όμ_μ‘°ν(κ³ κ΅λͺ
,
function(κ³ κ΅_DB_μ£Όμ) {
κ³ κ΅_μμ
_μ‘°ν(κ³ κ΅_DB_μ£Όμ, νμμ£Όλ―Όλ²νΈ,
function(κ³Όλͺ©μλ) {
let κ³ 3_μνμμ
_μ½λ = κ³Όλͺ©μλ["κ³ 3μν"];
μμ
_μ 보_μ‘°ν(κ³ 3_μνμμ
_μ½λ,
function(μμ
μ 보) {
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> console.log(`λ΄λΉκ΅μ¬: ${μμ
μ 보["κ΅μ¬λͺ
"]}`);
}
)
}
)
}
)
}
)
}
κ³ 3_μνκ΅μ¬_μ°ΎκΈ°(123456);
νμμ νλ²μΌλ‘ κ³ 3 μμ μνκ΅μ¬λ₯Ό μ°Ύλ μ½λμ΄λ€.
μ λ§λ μλλ μ½λμ κΉμ΄λ₯Ό κ°μ λ―μ΄λ³΄λ©° κ°μν΄λ³΄μ.
μ΄λ κ² μ½λ°±μ΄ μ€μ²©λ λ λ§λ€ μ½λκ° μμΌλ‘ λ€μ΄κ°κ² λκ³ ,
μ΄λ μ½λμ κ°λ
μ±μ ν΄μΉ λΏ μλλΌ λλ²κΉ
μμ
λν μ§μ₯μ΄ λμ΄λ²λ¦°λ€.
μ½λ°± μ§μ₯μμ λ²μ΄λκΈ° μν΄ ES6λΆν° λμ λ κ°μ²΄λ‘, μλ°μ€ν¬λ¦½νΈμ λ Έλμ APIλ€μ΄ μ½λ°± λμ νλ‘λ―Έμ€ κΈ°λ°μΌλ‘ μ¬κ΅¬μ± λμλ€. νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ©΄ λΉλκΈ° λ©μλμμ λ§μΉ λκΈ° λ©μλμ²λΌ κ°μ λ°νν μ μλ€. λ―Έλμ μ΄λ€ μμ μ κ²°κ³Όλ₯Ό μ 곡νκ² λ€λ "μ½μ(νλ‘λ―Έμ€)"λ₯Ό λ°ννλ κ²μ΄λ€. κ·Έλ¦¬κ³ μ΄ μ½μμ then μ ν΅ν΄ λ°λλ€.
function νμμ 보_μ‘°ν_Promise(νμ_νλ²) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "student-info/" + νμ_νλ², function (response) {
resolve(response);
});
})
}
function κ³ κ΅μ£Όμ_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ, κ³ κ΅λͺ
) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "highschoolDB/" + κ³ κ΅λͺ
, function (response) {
resolve([νμμ£Όλ―Όλ²νΈ,response]);
});
})
}
function κ³ κ΅_μμ
_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ, κ³ κ΅_DB_μ£Όμ) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "classes/" + κ³ κ΅_DB_μ£Όμ + "/" + νμμ£Όλ―Όλ²νΈ, function (response) {
resolve(response);
});
})
}
function μμ
_μ 보_μ‘°ν_Promise(κ³ 3_μνμμ
_μ½λ) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "class-info/" + κ³ 3_μνμμ
_μ½λ, function (response) {
resolve(response);
});
})
}
νμμ 보_μ‘°ν_Promise(123456)
.then(νμμ 보 => {
let νμμ£Όλ―Όλ²νΈ = νμμ 보["μ£Όλ―Όλ²νΈ"];
let κ³ κ΅λͺ
= νμμ 보["κ³ λ±νκ΅λͺ
"];
return κ³ κ΅μ£Όμ_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ, κ³ κ΅λͺ
);
})
.then(νμμ£Όλ―Όλ²νΈ_κ³ κ΅DBμ£Όμ => {
return κ³ κ΅_μμ
_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ_κ³ κ΅DBμ£Όμ[0], νμμ£Όλ―Όλ²νΈ_κ³ κ΅DBμ£Όμ[1]);
})
.then(μκ°κ³Όλͺ©μλ => {
let κ³ 3_μνμμ
_μ½λ = κ³Όλͺ©μλ["κ³ 3μν"];
return μμ
_μ 보_μ‘°ν_Promise(κ³ 3_μνμμ
_μ½λ);
})
.then(μμ
μ 보 => {
console.log(`λ΄λΉκ΅μ¬: ${μμ
μ 보["κ΅μ¬λͺ
"]}`);
})
νλ‘λ―Έμ€λ₯Ό λ°ννλλ‘ νμ¬, then λ©μλμ 체μ΄λμ ν΅ν΄ μ’ λ κΉλν μ½λλ₯Ό λ§λ€ μ μκ² λμλ€.
νλ‘λ―Έμ€ λ΄λΆμμ resolveκ° νΈμΆλλ©΄ thenμ΄ μ€νλκ³ , rejectκ° νΈμΆλλ©΄ catchκ° μ€νλλ€.
νμ§λ§ μμ§λ μΌλ ¨μ μ’
μμ μΈ μμ
λ€μ΄ νλμ νλ‘λ―Έμ€ μ²΄μΈμ λ¬Άμ¬μλ€.
async/awaitλ₯Ό μ¬μ©νλ©΄ λΉλκΈ° ν¨μλ₯Ό λ§μΉ λκΈ°μ μΈ μ½λμΈ κ² μ²λΌ λμνλλ‘ κ΅¬νν μ μλ€.
function νμμ 보_μ‘°ν_Promise(νμ_νλ²) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "student-info/" + νμ_νλ², function (response) {
resolve(response);
});
})
}
function κ³ κ΅μ£Όμ_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ, κ³ κ΅λͺ
) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "highschoolDB/" + κ³ κ΅λͺ
, function (response) {
resolve([νμμ£Όλ―Όλ²νΈ,response]);
});
})
}
function κ³ κ΅_μμ
_μ‘°ν_Promise(νμμ£Όλ―Όλ²νΈ, κ³ κ΅_DB_μ£Όμ) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "classes/" + κ³ κ΅_DB_μ£Όμ + "/" + νμμ£Όλ―Όλ²νΈ, function (response) {
resolve(response);
});
})
}
function μμ
_μ 보_μ‘°ν_Promise(κ³ 3_μνμμ
_μ½λ) {
return new Promise((resolve, reject) => {
ajax(
baseUrl + "class-info/" + κ³ 3_μνμμ
_μ½λ, function (response) {
resolve(response);
});
})
}
async function κ³ 3_μνκ΅μ¬_μ°ΎκΈ°(νμ_νλ²) {
let νμμ 보 = await νμμ 보_μ‘°ν_Promise(νμ_νλ²);
let κ³ κ΅_DB_μ£Όμ = await κ³ κ΅μ£Όμ_μ‘°ν_Promise(νμμ 보["μ£Όλ―Όλ²νΈ"], νμμ 보["κ³ λ±νκ΅λͺ
"]);
let μκ°κ³Όλͺ©μλ = await κ³ κ΅_μμ
_μ‘°ν_Promise(νμμ 보["μ£Όλ―Όλ²νΈ"], κ³ κ΅_DB_μ£Όμ);
let μμ
μ 보 = await μμ
_μ 보_μ‘°ν_Promise(μκ°κ³Όλͺ©μλ["κ³ 3μν"]);
console.log(`λ΄λΉκ΅μ¬: ${μμ
μ 보["κ΅μ¬λͺ
"]}`);
}
λλΌμΈ μ λλ‘ μ½λκ° μ§§μμ‘λ€.
ν¨μμ async ν€μλλ₯Ό λΆμ΄λ©΄ μλμΌλ‘ Promiseλ₯Ό 리ν΄νλ ν¨μλ‘ λ§λ€μ΄μ€λ€.
κ·Έλ¦¬κ³ awaitμ λΆμ΄λ©΄ ν΄λΉ νλ‘λ―Έμ€κ° resolve λ λ κΉμ§ κΈ°λ€λ Έλ€κ° κ²°κ³Όλ₯Ό λ°μΌλ©΄ λ€μ λ‘μ§μΌλ‘ λμ΄κ°λ€.
μ¦, Promise κ°μ²΄μ then κ²°κ³Όλ₯Ό λ°λ‘ λ°λ κ²μ΄λ€.
async/await μ μ¬μ©νλ©΄ awaitκ° λκΈ°λ₯Ό μ²λ¦¬ν΄μ£ΌκΈ° λλ¬Έμ .thenμ΄ κ±°μ νμνμ§ μλ€.
λν promise.catch λμ try/catchλ₯Ό μ¬μ©ν μ μκ² λλ€.
π κ° λΉλκΈ° μμ μ΄ μ€ν μμμ μν₯μ μ€λ€λ©΄ awaitμ ν΅ν΄ κΈ°λ€λ¦¬λ κ²μ΄ ν©λΉνμ§λ§ μμμ κ΄κ³μλ, λμμ μ²λ¦¬λ μ μλ μμ μ΄λΌλ©΄ μ΅λν λμμ μ€ν λ μ μλλ‘ ν΄μΌνλ€.
function delay(){
return new Promise( (resolve, reject) => {
setTimeout(() => resolve(), 1000);
})
}
async function getApple(){
await delay(); // 1μ΄ λλ μ΄ μ£ΌκΈ°
return "apple";
}
async function getBanana(){
await delay(); // 1μ΄ λλ μ΄ μ£ΌκΈ°
return "banana";
}
async function getFruites(){
let getApplePromise = getApple(); // asyncν¨μλ₯Ό μ€νμν¨λ€. λ
ΌλΈλ‘νΉμΌλ‘ λ°±λ¨μμ μ€νλκ² λλ€.
let getBananaPromise = getBanana(); // 리ν΄μΌλ‘ νλ‘λ―Έμ€ κ°μ²΄λ‘ κ°μΈμ§ κ²°κ³Όκ°μ λ°λλ€.
let a = await getApplePromise; // 리ν΄μΌλ‘ λ°μ νλ‘λ―Έμ€κ°μ²΄λ₯Ό done(data)λ₯Ό awaitμΌλ‘ λΉΌμ λ³μμ λ£μ
let b = await getBananaPromise;
console.log(`${a} and ${b}`);
}
getFruites(); // κ²°κ³Ό : apple and banana
getAppleκ³Ό getBananaλ μλ‘ μν₯μ μ£Όμ§ μλ κ΄κ³μ΄λ€.
λ°λΌμ λ ν¨μλ₯Ό λ
Ό λΈλ‘νΉ λ°©μμΌλ‘ νΈμΆνκ³ κ°κ°μ ν¨μλ νλ‘λ―Έμ€λ₯Ό λ°ννλ€. (pending μν)
κ·Έλ¦¬κ³ κ²°κ³Όλ await ν€μλλ₯Ό ν΅ν΄ μλμͺ½μμ λ°λλ€.
μ΄λ κ² λ³λ ¬μ μΌλ‘ μ²λ¦¬νλ€λ©΄ await getApple(), await getBanana() λ₯Ό νμ λ λ³΄λ€ ν¨μ¬ λ
μ±λ₯ μ’μ μ½λλ₯Ό μμ±ν μ μλ€.
μΆμ²: https://inpa.tistory.com/entry/JS-π-λΉλκΈ°μ²λ¦¬-async-await [π¨βπ» Dev Scroll]
Node.jsλ V8μμ§ κΈ°λ°μΌλ‘ λμνλ©° λ΄λΆμ Event Loopλ Single-Thread κΈ°λ°μμ λΉλκΈ° μμ
μ μ²λ¦¬νλ€.
μ΄λ¬ν μ΄λ²€νΈ 루νλ κ³ μ±λ₯μ λ³λ ¬μ²λ¦¬λ₯Ό 보μ₯νλλ‘ μ€κ³λμ΄ μλ€. λ°λΌμ μ΄λ²€νΈμ μν΄ μ²λ¦¬ν΄μΌ ν λ¨μ μμ
μ΄
μμ£Ό μ§§μ μκ° μμ μ²λ¦¬λλ€λ©΄ Node.jsμ μ₯μ μ κ·Ήλν ν μ μλ€.
κ·Έλ κΈ° λλ¬Έμ Node μ ν리μΌμ΄μ
μ κ°λ₯ν ν μ λΆ λΉλκΈ°λ‘ μ²λ¦¬ν΄μΌ νλ©° λμμ μ²λ¦¬λ μ μλ I/O μμ
μ΄λΌλ
λ
Ό λΈλ‘νΉ λ°©μμΌλ‘ μ½λ©νμ§ μμΌλ©΄ μλ―Έκ° ν΄μλλ€. λ°λΌμ λμμ²λ¦¬κ° κ°λ₯ν μμ
μ μ΅λν λ¬Άμ΄μ ν΄κ²°ν μ μλλ‘ μ½λ©νλ μ΅κ΄μ λ€μ¬μΌ νλ€.
[μ°Έκ³ μλ£]