promise.all μ νμ©νμ¬ κ·Έλ£Ήν λ promise μνμ ν΅ν΄ async ν¨μλ₯Ό ν¨κ³Όμ μΌλ‘ λΉ λ₯΄κ² μνν©λλ€.
μΆμ² : https://medium.freecodecamp.org/avoiding-the-async-await-hell-c77a0fb71c4c
λΉλκΈ°(async)λ μ½λ°±μ§μ₯(callback hell)μμ μ°λ¦¬λ₯Ό μμ λ‘κ²νμ΅λλ€. νμ§λ§ μ΄λ μλͺ»λ μ¬μ©μΌλ‘ μΈν΄ λΉλκΈ° μ§μ₯(async hell)μ νμμΌλ‘ μ΄μ΄μ‘μ΅λλ€.
μ΄ κΈμμλ async / await μ΄ λ¬΄μμΈμ§ μ€λͺ νλ©°, λΉλκΈ° μ§μ₯ νμΆμμν λͺ κ°μ§ νμ 곡μ ν©λλ€.
async μλ°μ€ν¬λ¦½νΈλ‘ μμ νλ λμ μ¬λλ€μ μ¬λ¬ λ¬Έμ₯μ μ°¨λ‘λ‘ μμ±νκ³ ν¨μ νΈμΆ μ μ κΈ°λ€λ¦¬κ³ μμ΅λλ€. μ΄λ‘ μΈν΄ νλμ λͺ λ Ήλ¬Έμ΄ μ΄μ λͺ λ Ήλ¬Έμ μμ‘΄νμ§ μμλ, μ΄μ λͺ λ Ήλ¬Έμ΄ μλ£ λ λκΉμ§ κΈ°λ€λ €μΌν©λλ€.
νΌμμ μ μ£Όλ¬Έμ μν μ½λ©μ μκ°ν΄λ³΄μμμ€.
(async () => {
const pizzaData = await getPizzaData() // async call
const drinkData = await getDrinkData() // async call
const chosenPizza = choosePizza() // sync call
const chosenDrink = chooseDrink() // sync call
await addPizzaToCart(chosenPizza) // async call
await addDrinkToCart(chosenDrink) // async call
orderItems() // async call
})()
κ²μΌλ‘ 보기μλ μ ννκ³ μ λμν©λλ€. νμ§λ§ μ€μ λ‘ μ’μ ꡬνμ μλλλ€. μ΄μ λ¬Έμ λ₯Ό μΈμνκ³ ν΄κ²°ν΄ 보λλ‘ ν©μλ€.
λΉλκΈ° ν¨μλ₯Ό μ¦μ μ€νν¨μλ‘ λννμ΅λλ€. μ΄λ μλ μμλ‘ λ°μν©λλ€.
1 νΌμ λͺ©λ‘ νλ.
2 μλ£ λͺ©λ‘μ νλ.
3 λͺ©λ‘μμ νΌμ μ ν.
4 λͺ©λ‘μμ μλ£ μ ν.
5 μ νν νΌμλ₯Ό μ₯λ°κ΅¬λ λ΄κΈ°.
6 μ νν μλ£λ₯Ό μ₯λ°κ΅¬λ λ΄κΈ°.
7 μ₯λ°κ΅¬λ νλͺ© μ£Όλ¬Έ.
μμ κ°μ‘°νλ―μ΄, μ΄ λͺ¨λ ꡬ문μ νλμ© μ€νλλ©° μ¬κΈ°μλ λμμ±μ΄ μμ΅λλ€.
μ μκ°ν΄ 보μΈμ : μ μ°λ¦¬λ μλ£ λͺ©λ‘μ κ°μ Έμ€κΈ° μ μ νΌμ λͺ©λ‘μ κ°μ Έμ€λ € κΈ°λ€λ¦¬λ μ€μ λκΉ? λ¨, νΌμλ₯Ό μ νν λ νΌμ λͺ©λ‘μ 미리 μ€λΉν΄μΌν©λλ€. μλ£μλ λ§μ°¬κ°μ§μ λλ€.
λ°λΌμ νΌμμ κ΄λ ¨λ μμ μ΄ λμμ μ§νλ μ μμΌλ, νΌμ κ΄λ ¨ κ°λ³ λ¨κ³λ μμ°¨μ μΌλ‘ (νλμ©) μνλμ΄μΌν©λλ€.
μλ μ½λλ μ₯λ°κ΅¬λμμλ νλͺ©μ κ°μ Έ μμ μ£Όλ¬Έμ μννλ κ²μ λλ€.
async function orderItems() {
const items = await getCartItems() // async call
const noOfItems = items.length
for(var i = 0; i < noOfItems; i++) {
await sendRequest(items[i]) // async call
}
}
μ΄ κ²½μ° for 루νλ λ€μ λ°λ³΅μ κ³μνκΈ° μ μ sendRequest() ν¨μκ° μλ£ λ λκΉμ§ λκΈ°ν΄μΌν©λλ€. κ·Έλ¬λ μ€μ λ‘ κΈ°λ€λ¦΄ νμλ μμ΅λλ€. λͺ¨λ μμ²μ κ°λ₯ν ν 빨리 보λ΄κ³ λͺ¨λ μμ²μ΄ μλ£ λ λκΉμ§ κΈ°λ€λ¦΄ μ μμ΅λλ€.
async / await μ§μ₯μ΄ λ¬΄μμΈμ§ μ΄μ κ°μ΄ μ€μλμ ?
λΉλκΈ°(async) ν¨μλ₯Ό νΈμΆνλ λμ κΈ°λ€λ¦¬λ κ²(await)μ λΉΌλ©΄ ν¨μκ° λ°λ‘ μ€νλκΈ° μμν©λλ€. μ¦, ν¨μλ₯Ό μ€ννλ λ° λκΈ° μκ°μ΄ νμνμ§ μμ΅λλ€. λΉλκΈ°(async) ν¨μλ λμ€μ μ¬μ©ν μμλ μ½μ(Promise)μ λ°νν©λλ€.
λ λ€λ₯Έ κ²°κ³Όλ μ»΄νμΌλ¬κ° ν¨μκ° μμ ν μ€νλ λκΉμ§ κΈ°λ€λ¦¬κ³ μΆλ€λ κ²μ μμ§ λͺ»νλ€λ κ²μ λλ€. λ°λΌμ μ»΄νμΌλ¬λ λΉλκΈ° μμ μ λλ΄μ§ μκ³ νλ‘κ·Έλ¨μ μ’ λ£ν©λλ€. κ·Έλμ μ°λ¦¬λ await ν€μλκ° νμν©λλ€.
μ½μ(Promise)μ ν κ°μ§ μ¬λ―Έμλ μμ±μ ν μ€μ μ½μ(Promise)μνκ³ λ€λ₯Έ μ½μ(Promise)μ ν΄κ²°ν λκΉμ§ κΈ°λ€λ¦΄ μ μλ€λ κ²μ λλ€. μ΄κ²μ async / await hellμ νΌνλ μ΄μ μ λλ€.
(async () => {
const promise = doSomeAsyncTask()
const value = await promise
console.log(value) // the actual value
})()
보μλ€μνΌ doSomeAsyncTask()κ° μ½μ(Promise)μ λ°νν©λλ€. μ΄ μμ μμ doSomeAsyncTask()κ° μ€νμ μμνμ΅λλ€. μ½μμ ν΄κ²° λ κ°μ μ»κΈ°μν΄ await ν€μλλ₯Ό μ¬μ©νλ©΄ JavaScriptκ° λ€μ μ€μ μ¦μ μ€ννμ§ μκ³ κ²°κ³Όλ₯Ό νμΈν ν μ€ννλΌλ μ½μ(Promise)μ κΈ°λ€λ¦½λλ€.
async/await μ νΌνκΈ° μν΄ λ€μ λ¨κ³λ₯Ό λ°λΌμΌν©λλ€.
첫 λ²μ§Έ μμμλ νΌμμ μλ£λ₯Ό μ ννμ΅λλ€. μ°λ¦¬λ νΌμλ₯Ό μ ννκΈ° μ μ νΌμ λͺ©λ‘μ κ°μ§κ³ μμ΄μΌνλ€κ³ κ²°λ‘ μ λ΄λ Έκ³ νΌμλ₯Ό μ₯λ°κ΅¬λμ λ£κΈ° μ μ νΌμλ₯Ό μ νν΄μΌν©λλ€. κ·Έλμ μ°λ¦¬λμ΄ μΈ λ¨κ³κ° μλ‘ μμ‘΄νλ€κ³ λ§ν μ μμ΅λλ€. μ°λ¦¬λ μ΄μ μΌμ λ§μΉ λκΉμ§ ν κ°μ§λ₯Ό ν μ μμ΅λλ€.
κ·Έλ¬λ μ’ λ κ΄λ²μνκ² μ΄ν΄λ³΄λ©΄ νΌμ μ νμ μλ£ μ νμ λ¬λ € μμ§ μκΈ° λλ¬Έμ λ³νμΌλ‘ μ νν μ μμμ μκ²λ©λλ€.
λ°λΌμ μ°λ¦¬λ λ€λ₯Έ λͺ λ Ήλ¬Έμ μ€νμ μμ‘΄νλ λͺ λ Ήλ¬Έκ³Ό κ·Έλ μ§ μμ λͺ λ Ήλ¬Έμ μμμΌ λ©λλ€.
μμμμ κ°μ΄ νΌμλ₯Ό μ ννλ κ²μ νΌμ λͺ©λ‘μ μ»κ³ κ·Έμ€ νλλ₯Ό μ ννκ³ λ μ΄ν νΌμλ₯Ό μ₯λ°κ΅¬λμ μΆκ°νλ κ²κ³Ό κ°μ μ’ μμ λ¬Έμ₯μ ν¬ν¨ν©λλ€. μ°λ¦¬λ μ΄λ¬ν λͺ λ Ήλ¬Έμ λΉλκΈ° ν¨μλ‘ κ·Έλ£Ήνν΄μΌν©λλ€. μ΄λ κ²νλ©΄ λ κ°μ λΉλκΈ° ν¨μ μΈ selectPizza () λ° selectDrink ()κ° λ°μν©λλ€.
μ΄ν λΉλκΈ°(λΉμ°¨λ¨)ν¨μλ₯Ό λμμ μ€ννκΈ° μν΄ μ΄λ²€νΈ 루νλ₯Ό μ΄μ©ν©λλ€.μ΄λ Promise.all ν¨μλ₯Ό ν΅ν΄ μ²λ¦¬ν μ μμ΅λλ€.
μ λ¨κ³λ₯Ό κ±°μ³ μμ μ μ μ© ν΄ λ³΄κ² μ΅λλ€.
async function selectPizza() {
const pizzaData = await getPizzaData() // async call
const chosenPizza = choosePizza() // sync call
await addPizzaToCart(chosenPizza) // async call
}
async function selectDrink() {
const drinkData = await getDrinkData() // async call
const chosenDrink = chooseDrink() // sync call
await addDrinkToCart(chosenDrink) // async call
}
(async () => {
const pizzaPromise = selectPizza()
const drinkPromise = selectDrink()
await pizzaPromise
await drinkPromise
orderItems() // async call
})()
// Although I prefer it this way
(async () => {
Promise.all([selectPizza(), selectDrink()].then(orderItems) // async call
})()
μ΄μ μ°λ¦¬λ λ λ¬Έμ₯μ λ κ°μ§ κΈ°λ₯μΌλ‘ κ·Έλ£Ήννμ΅λλ€.
ν¨μ λ΄μμ κ° κ΅¬λ¬Έμ μ΄μ ꡬ문μ μ€νμ μμ‘΄ν©λλ€. κ·Έλ° λ€μ selectPizza() λ° selectDrink() ν¨μλ₯Ό λμμ μ€νν©λλ€.
λ λ²μ§Έ μμμλ μ μμλ μ½μμ μ²λ¦¬ν΄μΌν©λλ€.
μ΄ μν©μ λ€λ£¨λ κ²μ λ§€μ° μ½μ΅λλ€. λ°°μ΄μ λ§λ€κ³ μ½μμ νΈμν©λλ€. κ·Έλ° λ€μ Promise.all()μ μ¬μ©νμ¬ μ°λ¦¬λ λͺ¨λ μ½μμ΄ λμμ ν΄κ²° λ λκΉμ§ κΈ°λ€λ¦½λλ€.
async function orderItems() {
const items = await getCartItems() // async call
const noOfItems = items.length
const promises = []
for(var i = 0; i < noOfItems; i++) {
const orderPromise = sendRequest(items[i]) // async call
promises.push(orderPromise) // sync call
}
await Promise.all(promises) // async call
}
μ΄ κΈμ ν΅ν΄ async / awaitμ κΈ°λ³Έμ μ΄ν΄νκ³ , μ΄ν μμ© νλ‘κ·Έλ¨μ μ±λ₯μ ν₯μμν€λ λ° λμμ΄λκΈ°λ₯Ό λ°λλλ€.