π Callback ν¨μλ?
π **μ½λ°± ν¨μ(callback function)**λ λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬λμ΄ νΉμ 쑰건μμ μ€νλλ ν¨μμ λλ€.
π Callback ν¨μ μμ
function main(callback) {
console.log('main μ€ν');
callback(); // μ λ¬λ ν¨μ μ€ν
}
main(function () {
console.log('β
μ½λ°± ν¨μ μ€ν');
});
β main() ν¨μλ callbackμ μΈμλ‘ λ°μ μ€νν©λλ€.
β main()μ νΈμΆν λ μ΅λͺ
ν¨μλ₯Ό μ λ¬νμ¬ μ½λ°± ν¨μλ‘ μ€νλ©λλ€.
π λΉλκΈ° μ½λ°± (Asynchronous Callback)
π λΉλκΈ° μμ
μ΄ μλ£λ νμ μ€νλλ μ½λ°± ν¨μμ
λλ€.
π λΉλκΈ° μ½λλ μ€ν μμκ° λ³΄μ₯λμ§ μκΈ° λλ¬Έμ μ½λ°± ν¨μλ₯Ό μ΄μ©ν΄ μμλ₯Ό μ μ΄ν μ μμ΅λλ€.
β λΉλκΈ° μ²λ¦¬ μμ΄ μ€ν
function getData() {
setTimeout(() => {
console.log('π‘ λ°μ΄ν° κ°μ Έμ€κΈ° μλ£');
}, 1000);
}
getData();
console.log('π νμ²λ¦¬ μ€ν'); // λ°μ΄ν°λ³΄λ€ λ¨Όμ μ€νλ¨
β getData()λ 1μ΄ νμ μ€νλμ§λ§,
β console.log('π νμ²λ¦¬ μ€ν')λ μ¦μ μ€νλλ―λ‘ λ°μ΄ν°λ³΄λ€ λ¨Όμ μΆλ ₯λ©λλ€.
π λΉλκΈ° μμ μ μ²λ¦¬νλ μ½λ°±
π μ½λ°±μ νμ©νλ©΄ λ°μ΄ν°λ₯Ό κ°μ Έμ¨ ν μ€νν μμ μ μ§μ ν μ μμ΅λλ€.
β μ½λ°±μ μ¬μ©ν λΉλκΈ° μμ
function getData2(callback) {
setTimeout(() => {
console.log('π‘ λ°μ΄ν° κ°μ Έμ€κΈ° μλ£');
callback({ data1: 'β
λ°μ΄ν°' }); // λ°μ΄ν° μ²λ¦¬ ν μ½λ°± μ€ν
}, 1000);
}
getData2((data) => {
console.log(data.data1); // λ°μ΄ν° μΆλ ₯
});
β getData2()κ° μλ£λ ν μ½λ°±μ μ€ννμ¬ λ°μ΄ν°λ₯Ό νμν©λλ€.
β μ΄ λ°©μμ λΉλκΈ° μμ
μ΄ μμλλ‘ μ€νλλλ‘ λ³΄μ₯ν©λλ€.
π¨ μ½λ°± μ§μ₯ (Callback Hell)
π μ½λ°±μ΄ κ³μ μ€μ²©λλ©΄ μ½λκ° μ½κΈ° μ΄λ ΅κ³ μ μ§λ³΄μνκΈ° μ΄λ €μμ§λλ€.
π μ΄λ₯Ό **μ½λ°± μ§μ₯(Callback Hell)**μ΄λΌκ³ ν©λλ€.
β μ½λ°± μ§μ₯ μμ
function step1(callback) {
setTimeout(() => {
console.log('π Step 1 μλ£');
callback();
}, 1000);
}
function step2(callback) {
setTimeout(() => {
console.log('π Step 2 μλ£');
callback();
}, 1000);
}
function step3(callback) {
setTimeout(() => {
console.log('π Step 3 μλ£');
callback();
}, 1000);
}
// μ½λ°± μ§μ₯ λ°μ
step1(() => {
step2(() => {
step3(() => {
console.log('π λͺ¨λ μμ
μλ£');
});
});
});
β λ€μ¬μ°κΈ°κ° κΉμ΄μ§κ³ , μ½λκ° λ³΅μ‘ν΄μ Έμ κ°λ
μ±μ΄ λ¨μ΄μ§λλ€.
β μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ Promiseλ₯Ό μ¬μ©ν©λλ€.
π μ½λ°± μ§μ₯ ν΄κ²°: Promise μ¬μ©
π Promiseλ₯Ό μ¬μ©νλ©΄ κ°λ μ±μ λμ΄κ³ λΉλκΈ° μ²λ¦¬λ₯Ό μμ°¨μ μΌλ‘ μ€νν μ μμ΅λλ€.
function step1() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('π Step 1 μλ£');
resolve();
}, 1000);
});
}
function step2() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('π Step 2 μλ£');
resolve();
}, 1000);
});
}
function step3() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('π Step 3 μλ£');
resolve();
}, 1000);
});
}
// Promise 체μ΄λμ νμ©ν λΉλκΈ° μ²λ¦¬
step1()
.then(step2)
.then(step3)
.then(() => {
console.log('π λͺ¨λ μμ
μλ£');
});
β .then() 체μ΄λμ μ¬μ©νλ©΄ μ½λ°± μ§μ₯ μμ΄ λΉλκΈ° μ²λ¦¬λ₯Ό μμ°¨μ μΌλ‘ μ€νν μ μμ΅λλ€.
β μ½λκ° κ°κ²°νκ³ κ°λ
μ±μ΄ μ’μμ§λλ€.
π μ΅μ λ°©μ: async / await
π async / awaitλ₯Ό μ¬μ©νλ©΄ λ μ§κ΄μ μΈ μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
async function processSteps() {
await step1();
await step2();
await step3();
console.log('π λͺ¨λ μμ
μλ£');
}
processSteps();
β awaitμ μ¬μ©νλ©΄ λ§μΉ λκΈ° μ½λμ²λΌ λΉλκΈ° μμ
μ μ€νν μ μμ΅λλ€.
β async ν¨μ λ΄λΆμμ awaitμ μ¬μ©νλ©΄ μ½λμ νλ¦μ΄ μ§κ΄μ μ΄ λ©λλ€.
π μ 리
- μ½λ°± ν¨μ → λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬λμ΄ μ€νλλ ν¨μ
- λΉλκΈ° μ½λ°± → λΉλκΈ° μμ μ΄ μλ£λ ν μ€νλλ ν¨μ
- μ½λ°± μ§μ₯ → μ½λ°±μ΄ μ€μ²©λμ΄ μ½λκ° λ³΅μ‘ν΄μ§λ νμ
- Promise → μ½λ°± μ§μ₯μ ν΄κ²°νκΈ° μν κ°μ²΄ (.then() 체μ΄λ)
- async / await → Promiseλ₯Ό λ μ½κ² μ¬μ©ν μ μλλ‘ λμμ£Όλ μ΅μ λ¬Έλ²
π’ μ½λ°±λ³΄λ€ Promise λλ async/awaitμ νμ©νλ©΄ μ½λκ° λ μ½κΈ° μ½κ³ μ μ§λ³΄μκ° νΈλ¦¬ν©λλ€! π
// callback ν¨μ: λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬λλ ν¨μ
function main(callback) {
callback();
}
// mainμ μΈμλ‘ μ λ¬λλ ν¨μκ° callback ν¨μλ€.
main(function () {});
main(() => {});
// λΉλκΈ° μ½λ°±: λΉλκΈ°μ κ²½μ° μ½λμ μ€ν μμκ° λ€μ£½λ°μ£½ λ μ μμΌλ―λ‘ λΉλκΈ° μ½λ°±μ μ¬μ©ν΄μ
// μ°¨λ‘λλ‘ λ€μ ν¨μκ° μ€νλλλ‘νλ€.
// μλ² -> λΉλκΈ°μμ
-> λ€μμμ
-> νμ²λ¦¬
function getData() {
setTimeout(() => {
console.log('data');
}, 1000);
}
getData();
console.log('νμ²λ¦¬');
// μμ κ²½μ° λ°μ΄ν°λ₯Ό λ°μμ€κΈ° μ μ λ€μ μμ
μ μ€ννκ² λλ€.
function getData2(callback) {
setTimeout(() => {
console.log('data');
callback({ data1: 'data' });
}, 1000);
}
getData2((data) => {
console.log(data.data1);
});
// μμ κ²½μ° getData2μμ dataλ₯Ό νμν ν data1 κ°μ²΄λ₯Ό λ°μμ€κ³ data1μ κ°μ νμνλ€.
// μ κ°μ κ²½μ°κ° λ°λ³΅λλ©΄ μ½λ°± μ§μ₯μ λΉ μ§κ² λλ€. μ΄λ promiseλ₯Ό μ¬μ©νλ©΄ λλ€.β'JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [JavaScript] ꡬ쑰 λΆν΄ ν λΉ (4) | 2024.12.22 |
|---|---|
| [JavaScript] Reduce (5) | 2024.12.22 |
| [JavaScript] async & await (6) | 2024.12.20 |
| [JavaScript] Fetch, AJAX, Axios (2) | 2024.12.20 |
| [JavaScript] Promise (0) | 2024.12.20 |