μλ νμΈμ Fomaπ» μ λλ€.
μ€λλ λͺ¨λ μλ°μ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ λ°°μ΄ Callback ν¨μμ Promiseμ λν΄μ μ κ° μ΄ν΄ν λ°©μλλ‘
μ 리ν΄λ³΄λλ‘ νκ² μ΅λλ€.
λ°λ‘ μμν κ²μ~
Callback
Callback ν¨μλ μ€ννλ μ¦μ μλ£λλ κ²μ΄ μλλΌ νΉμ μμ μ μ€ννκ³ λ§μΉ λ€μ μλ£λλ€.
μ¦, λΉλκΈ°μ μΌλ‘ μ²λ¦¬λλ κ²μ μλ―Ένλ€.
λ§μ½ μ€ν¬λ¦½νΈλ₯Ό λ§λλ μμ μ΄ μλ€λ©΄ μμ μ΄ μ μμ μΌλ‘ μ²λ¦¬λκ±°λ μ€κ°μμ μλ¬κ° λ°μνλ κ²½μ°μ μμ μ΄ μλ£λλ€.
μ½λ°± ν¨μκ° μλ£λλ κ²½μ°λ μ μμ μΌλ‘ μ²λ¦¬λμκ±°λ, μλ¬κ° λ°μν κ²½μ° λΏμ΄λ€.
μ½λ°± ν¨μλ₯Ό μμ±νλ λ°©μμ μνλ νλΌλ―Έν° κ°κ³Ό ν¨κ» μμ μ μ€νν ν¨μλ₯Ό λ°λμ κ°μ΄ λ£μ΄μ€λ€.
function loadScript(src,callback) {
let script = document.createElement('script')
script.src = src
//μ μμ μΌλ‘ μ²λ¦¬λμ κ²½μ°
script.onload = () => callback(null,script)
//μλ¬κ° λ°μνμ κ²½μ°
script.onerror = () => callback(new Error(`${src}λ₯Ό λΆλ¬μ€λ λμ€μ μλ¬κ° λ°μνμ΅λλ€.`))
document.head.append(script)
}
//μ½λ°±ν¨μ μ€ν
loadScript('/javascript/syntax.js',function(error,script) {
if (error) {
//μλ¬κ° μλ€λ©΄ μλ¬ μ²λ¦¬
}else {
//μλ€λ©΄ μ μμ€ν
}
})
Pyramid of doom
Pyramid of doomμ λ©Έλ§μ νΌλΌλ―ΈλλΌκ³ λ νλλ°, μ΄κ²μ μ²λ¦¬ν΄μΌν μ½λ°± ν¨μκ° μ¬λ¬κ°μΈ κ²½μ°μ λ°μνλ€.
μ½λ°± ν¨μ μμ μ½λ°± ν¨μκ° μ΄μ΄ μλ κ²½μ°μ΄λ―λ‘ μ½λκ° κ°λ‘,μΈλ‘ λͺ¨λ κΈΈκ² μ΄μ΄μ§λ€.
μ΄κ²μ μ½λμ κ°λ μ±μ΄ μμ’μμ§κΈ° λλ¬Έμ μ½λ°± ν¨μμ ν° λ¨μ μ΄λ€.
loadScript('1.js', function(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('2.js', function(error, script) {
if (error) {
handleError(error)
} else {
// ...
loadScript('3.js', function(error, script) {
if (error) {
handleError(error)
} else {
// λͺ¨λ μ€ν¬λ¦½νΈκ° λ‘λ©λ ν, μ€ν νλ¦μ΄ μ΄μ΄μ§λλ€. (*)
}
})
}
})
}
})
μλμ κ°μ΄ λλ μ°λ©΄ μμ μ½λλ₯Ό μνν μ μμ§λ§, μ΄κ² λν μ€νν΄μΌ ν μ€ν¬λ¦½νΈλ§νΌ μ½λλ₯Ό μμ±ν΄μΌ νκ³ μ¬μ¬μ©μ΄ λΆκ°νλ€.
function step1(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('2.js', step2);
}
}
function step2(error, script) {
if (error) {
handleError(error);
} else {
// ...
loadScript('3.js', step3);
}
}
function step3(error, script) {
if (error) {
handleError(error);
} else {
// λͺ¨λ μ€ν¬λ¦½νΈκ° λ‘λ©λλ©΄ λ€λ₯Έ λμμ μνν©λλ€. (*)
}
};
Promise
Promiseλ μμ κ°μ μ½λ°± ν¨μμ λ¨μ μ λ체ν μ μλ κ°μ²΄μ΄λ€.
μμ±νλ λ°©λ²μ μλμ κ°μ΄ μ±κ³΅(resolve)νμ λμ μ€ν¨(reject)νμ λλ₯Ό νλΌλ―Έν°λ‘ μμ±ν λ κ°μ΄ λ£μ΄μ€λλ€.
κ·Έλ¦¬κ³ μ±κ³΅νμ λλ resolove(μνλ κ°), μλ¬κ° λ°μνμ λ reject(μλ¬)λ‘ κ°μ λ°ννλ€.
let promise = new Promise(function(resolve,reject) {
//λ§μ½ μλ¬κ° μλ€λ©΄
resolve("μ±κ³΅")
//μλ¬κ° λ°μνλ€λ©΄
reject(new Error("μλ¬λ°μ"))
})
μμμ λ§λ promise κ°μ²΄λ₯Ό ꡬλ νμ¬ κ°μ΄ λ°νλμ λ λ°μμ¬ μ μλλ°, μ΄κ²μ .thenμΌλ‘ μμ±νλ€.
promise.then(
//κ²°κ³Όκ° μλ¬κ° μμΌλ©΄
result => console.log(result),
//κ²°κ³Όκ° μλ¬κ° μλ€λ©΄
error => console.log(error)
)
μ±κ³΅νμ λλ§ λ°μμ€κ³ μΆλ€λ©΄ μλμ κ°μ΄ μ±κ³΅μ λν μμ λ§ μ²λ¦¬ν΄μ£Όκ³ ,
promise.then(result => console.log(result))
μ€ν¨νμ λλ§ λ°μμ€κ³ μΆλ€λ©΄ .catchλ₯Ό μ΄μ©ν΄μ μλ¬λ₯Ό νΈλ€λ§ ν μ μλ€.
promise.catch(error => console.log(error))
λν μ€ν¨νλ μ±κ³΅νλ 무쑰건 μ²λ¦¬λλ μ΄λ ν μμ μ΄ μλ€λ©΄ finallyλ₯Ό ν΅ν΄ μ²λ¦¬ν΄μ€λ€.
promise.finally(
console.log("Finally 무쑰건 μ€νλ¨.")
).then(result => console.log(result))
.catch(error => console.log(error))
μ μ½λ°± ν¨μ loadScriptλ₯Ό Promiseλ‘ λ€μ μμ±νλ©΄ μλμ κ°λ€.
function loadScript(src) {
return new Promise(function(resolve,reject) {
let script = document.createElement('script')
script.src = src
script.onload = () => resolve(script)
script.onerror = () => reject(new Error(`${src}λ₯Ό λΆλ¬μ€λ λμ€ μλ¬λ°μ`))
document.head.append(script)
})
}
μ½λ°± ν¨μμ ν° λ¨μ μ΄μλ λ©Έλ§μ νΌλΌλ―Έλλ₯Ό μλμ κ°μ΄ μ§§κ³ , κ°λ μ± μκ² μμ±ν μ μκ² λλ€.
fetch("https://www.naver.com")
.then(script => fetch("https://www.naver.com"))
.then(script => fetch("https://www.google.com"))
.then(script => {
console.log(script)
})
Promise API
μ΄ μΈμλ Promiseμ μ₯μ μ μ¬λ¬κ°μ§ APIλ₯Ό κ°μ§κ³ μλ€λ κ²μ΄λ€.
Promise.all
μ¬λ¬ νλ‘λ―Έμ€λ₯Ό νλ²μ λ΄μμ μ²λ¦¬ν μ μλ€.
λ¨, νλλΌλ μλ¬κ° λ°μνλ€λ©΄ κ·Έ μ¦μ μ€λ¨νκ³ μλ¬λ₯Ό λ°ννλ€.
Promise.all([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("μλ¬ λ°μ!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).catch(alert); // Error: μλ¬ λ°μ!
Promise.allSettled
Promise.allκ³Ό κ°μ΄ μ¬λ¬ νλ‘λ―Έμ€λ₯Ό λ΄μ νλ²μ μ²λ¦¬νλλ°,
μμ μ΄ μλ£λμμΌλ©΄ fullfilledλ‘ μλ¬κ° λ°μνμΌλ©΄ rejectλ‘ λͺ¨λ λ°νλλ€.
Promise.allSettled([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("μλ¬ λ°μ!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(results => {
results.forEach((result, num) => {
if (result.status == "fulfilled") {
console.log(`${result.value.status}`)
}
if (result.status == "rejected") {
console.log(`${result.reason}`)
}
})
/*
{status: 'fulfilled'.},
{status: 'fulfilled'},
{status: 'rejected'}
*/
Promise.race
μμ λ APIμ κ°μ΄ λͺ¨λ νλ²μ λ΄μμ μ²λ¦¬νμ§λ§ κ°μ₯ μ²λ¦¬ μλκ° λΉ λ₯Έ κ²μ μμ κ²°κ³Όλ₯Ό λ°ννλ€.
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("μλ¬ λ°μ!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(result => console.log(result)); // 1
Async & Await
Asyncμ Awaitλ₯Ό μ¬μ©νλ©΄ Promiseλ₯Ό μ’ λ νΈνκ² μ¬μ©ν μ μλ€.
λΉλκΈ°μ μΌλ‘ μ²λ¦¬λλ μ΄λ€ ν¨μκ° μλ€λ©΄ μμ asyncλ₯Ό λΆμ¬μ€λ€.
κ·Έ λ€μ ν΄λΉ ν¨μλ₯Ό Promiseμ λμΌνκ² κ΅¬λ ν΄μ κ²°κ³Όλ₯Ό λ°μμ¨λ€.
async function f() {
return 1
}
f().then(result => console.log(result))
λλ Promiseλ₯Ό μμ±ν΄μ κ²°κ³Όκ°μ awaitμ ν΅ν΄ κ°μ Έμ¬ μλ μλ€.
async function f(){
let promise = new Promise((resolve,reject) => {
setTimeout(() => resolve("μλ£"),1000)
})
let result = await promise
console.log(result)
}
κΉνμμ μλ°νλ₯Ό κ°μ Έμ€λ κ³Όμ μ async&awaitκ³Ό Promiseλ₯Ό μ¬μ©ν΄μ λνλ΄λ©΄ μλμ κ°λ€.
async function showAvatar(url) {
let response = await fetch(url)
let user = await response.json()
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`)
let githubUser = await githubResponse.json()
let img = document.createElement('img')
img.src = githubUser.avatar._url
img.className = 'promise-avatar-example'
document.body.append(img)
await new Promise((resolve,reject) => setTimeout(resolve,3000))
img.remove()
return githubUser
}
Reference
'π Language > Javascript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] κ³ κΈ μ°μ°μ(Advanced Operator)λ? (feat. λΉνΈμ°μ°μ) (0) | 2022.02.26 |
---|---|
[JS] Static,Protected,Privateμ λν΄ μμ보기 (0) | 2022.02.15 |
[JS] ν΄λμ€(Class) κΈ°λ³Έ λ¬Έλ²κ³Ό μμ (0) | 2022.02.12 |
[JS] νλ‘ν νμ (Prototype) λ€λ€λ³΄κΈ° (0) | 2022.02.12 |
[JS] νλ‘νΌν° μ΅μ (νλκ·Έ) λ€λ£¨κΈ°(Property Flag) (0) | 2022.02.12 |
λκΈ