Callback,Promise,async/await
νμ΅ ν€μλ
Callback ν¨μ
Promise
async/await
Callback ν¨μ
λ€λ₯Έν¨μμ λ§€κ°λ³μλ‘ μ λ¬λλ ν¨μλ₯Ό μλ―Έ
μ΄λ€ μμ μ΄ λλκ±°λ μ΄λ²€νΈκ° λ°μνμ λ νΈμΆλλ ν¨μλ₯Ό μλ―Έ
μΌλ°μ μΌλ‘ λΉλκΈ° ν¨μ μ²λ¦¬κ° λλλ©΄ μ€νν μμ μΌλ‘ μ½λ°±ν¨μλ₯Ό μ λ¬
π€ μ½λ°±ν¨μκ° μ¬μ©λλ μ΄μ λ?
μλ°μ€ν¬λ¦½νΈλ λκΈ°μ λ°©μ
μΌλ‘ νλ²μ νκ°μ§ μΌλ§ μ²λ¦¬νλ€. μ¦, ν¨μκ° νΈμΆ λλ μμλλ‘ μμ°¨μ μΌλ‘ μ½λκ° μ€ν λλ€. κ·Έλ¬λ, λ€νΈμν¬ μμ²κ³Ό κ°μ΄ μκ°μ΄ 걸리λ μμ
μ μν ν΄μΌ νκΈ° λλ¬Έμ νμ¬ μ€ν μ€μΈ μ½λκ° μ’
λ£ λμ§ μμ μνλΌν΄λ κΈ°λ€λ¦¬μ§ μκ³ λ€μ μ½λλ₯Ό λ°λ‘ μ€ννλλ‘ λΉλκΈ° λ°©μ
μΌλ‘ μ½λλ₯Ό μ€νμν¨λ€. μ΄μ κ°μ΄ μμκ° λ³΄μ₯ λμ§ μλ μν©μμ μμκ° λ³΄μ₯λκ±°λ, λΉλκΈ° ν¨μ μ²λ¦¬κ° λλλ©΄ μ€νν μμ
μ μ½λ°±ν¨μμ μ λ¬νμ¬ μ¬μ©νλ€.
π©π»βπ» μ½λ°±ν¨μ μ¬μ©ν΄λ³΄μ
function task1() {
console.log('첫λ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
}
function task2() {
// β
μμκ° λ³΄μ₯λμ§ μλ ν¨μ λ‘μ§μ΄ μλ€λ©΄?
setTimeout(() => {
console.log('λλ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
}, 2000);
}
function task3() {
console.log('μΈλ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
}
function task4() {
console.log('λ€λ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
}
task1();
task2();
task3();
task4();
μμ μ½λλ₯Ό 보면 task2
ν¨μλ΄λΆμλ λΉλκΈ°λ‘ λμνλ ν¨μ setTimeout
μ‘΄μ¬νλ€. λ΄κ° μλνλ건 task1 β task2 β task3 β task4
μμΌλ‘ λμνκΈΈ μνλ€. κ·Έλ¬λ task1 β task3 β task4 β task2
μμΌλ‘ λμλμ΄ μλν λ°©ν₯κ³Όλ λ¬λλ€. κ·Έλ λ€λ©΄ μ½λ°±ν¨μλ₯Ό μ¬μ©ν΄μ μμλ₯Ό 보μ₯νλ μ½λλ₯Ό μμ±ν΄λ³΄μ!
function task1(callback) {
console.log('첫λ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
callback();
}
function task2(callback) {
// β
μμκ° λ³΄μ₯λμ§ μλ ν¨μ λ‘μ§μ΄ μλ€λ©΄?
setTimeout(() => {
console.log('λλ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
callback();
}, 2000);
}
function task3(callback) {
console.log('μΈλ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
callback();
}
function task4(callback) {
console.log('λ€λ²μ§Έλ‘ μ€νλμ΄μΌ νλ ν¨μ');
callback();
}
task1(() => {
task2(() => {
task3(() => {
task4(() => {
console.log('λͺ¨λ ν¨μ μ€ν μλ£!!');
});
});
});
});
π± μ½λ°±μ§μ₯(Callback hell)

λΉλκΈ° ν¨μκ° μ²λ¦¬κ° λλλ©΄ μ€νλμ΄μΌ ν μ½λ°±ν¨μλ€μ΄ μ€μ²©λμ΄ indent(λ€μ¬μ°κΈ°)κ° μ μ κΉμ΄μ§λ ννλ‘ λκ³ μ΄μκ°μ΄ μ½λμ κ°λ μ±μ΄ μμ’μμ§κ² λλ μν©μ
μ½λ°±μ§μ₯
,Callback hell
μ΄λΌκ³ λΆλ₯Έλ€.
Promise
μ½λ°±ν¨μμ λ¨μ μ 보μνλ©° λΉλκΈ° μ²λ¦¬λ₯Ό λ³΄λ€ ν¨μ¨μ μΌλ‘ μ²λ¦¬νκΈ° μν΄ ES6 μΆκ°λ λ¬Έλ²
μλ°μ€ν¬λ¦½νΈμ νΉμ κ°μ²΄ (
λΉλκΈ° ν¨μμ κ²°κ³Όλ₯Ό λ΄κ³ μλ κ°μ²΄
)λκ°μ μ½λ°±ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°λλ°, μμ μ΄ μ±κ³΅μ μΌλ‘ μλ£λμμ λ κ²°κ³Όλ₯Ό λ°ννλ
resolve ν¨μ
μ μμ μ΄ μ€ν¨νμλ μλ¬λ₯Ό λ°ννλreject ν¨μ
κ° μλ€.
κΈ°λ³Έ λ¬Έλ²
new ν€μλλ₯Ό ν΅ν΄ μμ±
resolve, rejectλ₯Ό λ§€κ°λ³μλ‘ νλ ν¨μ μ λ¬λ°λλ€.
resolve
: λΉλκΈ° μ²λ¦¬κ° μ±κ³΅νμ λ νΈμΆν ν¨μreject
: λΉλκΈ° μ²λ¦¬κ° μ€ν¨νμ λ νΈμΆν ν¨μ
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success');
reject('fail');
}, 2000);
});
promise
.then((res) => {
console.log(res); // success
})
.catch((err) => {
console.log(err); // fail
});
π Promise 3κ°μ§ μν
pending(λκΈ°)
new Promise()
λ©μλλ‘ νΈμΆνλ©΄ λκΈ° μνκ° λλ€.λΉλκΈ° μ²λ¦¬ λ‘μ§μ΄ μμ§ μλ£ λμ§ μμ μν
fulfilled(μ΄ν)
λΉλκΈ° μμ μ΄ μλ£λμ΄ νλ‘λ―Έμ€κ° κ²°κ³Όκ°μ λ°νν΄μ€ μν
then
μ ν΅ν΄ μ²λ¦¬κ°μ μ λ¬λ°μ μΆκ°μ μΈ μ²λ¦¬ κ°λ₯
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success'); // λΉλκΈ° ν¨μκ° μλ£λλ©΄ resolve()ν¨μ μ€ν
}, 2000);
});
promise.then((res) => {
// resolve()μ κ²°κ³Όκ° μ½λ°±ν¨μμ μΈμλ‘ μ λ¬λ°μ μ¬μ© κ°λ₯
console.log(res);
});
rejected(μ€ν¨)
λΉλκΈ° μμ μ΄ μ€ν¨νκ±°λ μ€λ₯κ° λ°μν μν
μ€ν¨μνκ° λλ©΄ μ€ν¨ν μ΄μ λ₯Ό
catch
λ‘ λ°μ μ μλ€.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject('fail'); // λΉλκΈ° ν¨μκ° μ€ν¨νλ©΄ reject()ν¨μ μ€ν
}, 2000);
});
promise.catch((res) => {
// reject()μ μ€ν¨μ΄μ λ₯Ό μ λ¬ λ°μ μΆκ°μ μΈ μ²λ¦¬ κ°λ₯
console.log(res);
});
βοΈ Promise 체μ΄λ
Promise κ°μ²΄μ λ©μλλ₯Ό μ°κ²°μ§μ΄ μ¬μ©νλ μν©
promise
.then((value) => {
console.log(value);
})
.catch((error) => {
console.log(error);
});
π± Promise hellλ μ‘΄μ¬νλ€
μλ μ½λμ κ°μ΄ then λ©μλλ₯Ό ν΅ν΄ κ²°κ³Όκ°μ μΈμλ‘ λ°μμμ μμ μ μννκ³ , λ€μ then λ©μλλ₯Ό νΈμΆνκ³ , λ then,then,... μ κ°μ΄ μμ μ΄ λ¬΄μν κΈΈμ΄μ§κΈ° λλ¬Έμ μ½λ°±μ§μ₯μ μ΄μ΄
νλ‘λ―Έμ€ ν¬
μ΄λΌλ ννλ μλ€.
function sum(num) {
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof num === 'number') {
resolve(num + 1);
} else {
reject('numμ΄ μ«μκ° μλλλ€.');
}
}, 2000);
});
return promise;
}
sum(0).then((result) => {
console.log(`κ²°κ³Ό : ${result}`);
sum(result).then((result2) => {
console.log(`κ²°κ³Ό : ${result2}`);
sum(result2).then((result3) => {
console.log(`κ²°κ³Ό : ${result3}`);
sum(result3).then((result4) => {
console.log(`κ²°κ³Ό : ${result4}`);
});
});
});
});
π₯ return νμ©ν΄ Promise hell ν΄κ²°νμ
returnλ‘
promise
κ°μ²΄λ₯Ό λ°νν΄μ μ¬μ©νλ©΄ hellμμ λ²μ΄λ μ μλ€.
sum(0)
.then((result) => {
console.log(`κ²°κ³Ό : ${result}`);
return sum(result); // ππ» promise λ°ννλ ν¨μ
})
.then((result2) => {
console.log(`κ²°κ³Ό : ${result2}`);
return sum(result2);
})
.then((result3) => {
console.log(`κ²°κ³Ό : ${result3}`);
return sum(result3);
})
.then((result4) => {
console.log(`κ²°κ³Ό : ${result4}`);
return sum(result4);
})
.catch((err) => {
console.log(`κ²°κ³Ό : ${err}`);
});
Promiseμ μ μ λ©μλ
μ¬λ¬κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό
λ³λ ¬μ
μΌλ‘ μ²λ¦¬ν λ μ¬μ©νλ€.κ°κ°μ λΉλκΈ° νΈμΆ μμκ° μκ΄ μμ λ μ¬μ©νλ€.
μ£Όμ΄μ§ νλ‘λ―Έμ€ μ€ νλκ° κ±°λΆνλ κ²½μ°, μ 체λ₯Ό reject μ²λ¦¬νλ€.
function getEmoticon(icon) {
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof icon === 'string') {
resolve(icon);
} else {
reject('μ΄λͺ¨ν°μ½μ λ£μ΄μ£ΌμΈμ!');
}
}, 2000);
});
return promise;
}
Promise.all([getEmoticon('π'), getEmoticon('π'), getEmoticon('π')]).then(
(results) => {
console.log(results); // [ 'π', 'π', 'π' ]
}
);
μ¬λ¬κ°μ λΉλκΈ° μ²λ¦¬ μ€ κ°μ₯ λ¨Όμ
fulfilled
λ μ²λ¦¬ κ²°κ³Όλ₯Ό κ°μ Έμ¬ λ μ¬μ©
function getEmoticon(icon, ms) {
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof icon === 'string') {
resolve(icon);
} else {
reject('μ΄λͺ¨ν°μ½μ λ£μ΄μ£ΌμΈμ!');
}
}, ms);
});
return promise;
}
Promise.race([
getEmoticon('π', 4000),
getEmoticon('π', 2000),
getEmoticon('π', 1000),
]).then((results) => {
console.log(results); // π λ§ λ°νλ¨.
});
μ¬λ¬κ°μ λΉλκΈ° μ²λ¦¬κ° λͺ¨λ
fulfilled
λreject
λ μ²λ¦¬ κ²°κ³Όλ₯Ό resolveνλ promiseλ₯Ό λ°ν
function getEmoticon(icon, ms) {
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof icon === 'string') {
resolve(icon);
} else {
reject('μ΄λͺ¨ν°μ½μ λ£μ΄μ£ΌμΈμ!');
}
}, ms);
});
return promise;
}
Promise.allSettled([
getEmoticon('π', 4000),
getEmoticon(2, 2000),
getEmoticon('π', 1000),
]).then((results) => {
console.log(results);
});
// μΆλ ₯κ²°κ³Ό
/**
[
{ status: 'fulfilled', value: 'π' },
{ status: 'rejected', reason: 'μ΄λͺ¨ν°μ½μ λ£μ΄μ£ΌμΈμ!' },
{ status: 'fulfilled', value: 'π' }
]
*/
async/await
Promiseλ₯Ό μ‘°κΈ λ κ°νΈνκ³ , κ°λ μ± μ’κ² μ¬μ©νκΈ° μν΄ λμ¨ λ¬Έλ²
β async/awaitλ promise λ₯Ό κΈ°λ°μΌλ‘ λμνλ€. promiseμ then,catch,finally νμ μ²λ¦¬ λ©μλμ μ½λ°±ν¨μλ₯Ό μ λ¬ν΄μ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ²λ¦¬ν νμ μμ΄ λ§μΉ λκΈ°μ²λΌ νλ‘λ―Έμ€λ₯Ό μ¬μ©ν μ μλ€.
κΈ°λ³Έλ¬Έλ²
ν¨μ μμ
async
λ₯Ό λΆμ΄λ©΄λΉλκΈ°μ μΈ ν¨μμ΄κ³ , Promiseλ₯Ό λ°ννλ€
λΌκ³ μ μΈνκ³ , λ°ν κ°μ΄ Promise μμ±ν¨μκ° μλμ΄λ λ°νλλ κ°μ Promise κ°μ²΄μ λ£λλ€.
const getData = async (url) => {
const response = await fetch(url); // ππ» Promiseμ μν λ³κ²½μ΄ λκΈ°μ κΉμ§ λ€μμ½λλ μ€νλμ§ μλλ€.
const result = await response.json();
console.log(result);
};
await
μasync
ν¨μ μμμλ§ μ¬μ©ν μ μκ³ , Promiseλ₯Ό λ°ννλ ν¨μ μμawait
λ₯Ό λΆμ΄λ©΄ Promiseκ° μ±κ³΅ μν λλ μ€ν¨ μνλ‘ λ°λκΈ° μ κΉμ§λ λ€μ μ°μ°μ νμ§μμ λκΈ°μ μΌλ‘ μλλλ€.
async/await μμΈμ²λ¦¬
Promiseλ νμ μ²λ¦¬κ° λ§μμ§μλ‘ then λ΄λΆμ μ½λκ° μ€μ²©λλ©΄μ μ½λ νλ¦μ΄ 볡μ‘ν΄μ§λ μν©μ 보μνκΈ° μν΄
try/catch
μΌλ‘ κ°λ¨ν μ²λ¦¬ ν μ μλ€.
const getData = async (url) => {
try {
const response = await fetch(url);
const result = await response.json();
console.log(result);
} catch (error) {
console.log(error);
}
};
π μ°Έκ³
Last updated