November 09, 2020
μλ°μ€ν¬λ¦½νΈλ λκΈ°μ μ΄λ€.
νΈμ΄μ€ν μ΄ λ μ΄νλΆν° μμ±λ μμλλ‘ μ€νλλ€.
Hoisting μ΄λ, var κ³Ό function declaration μ΄ μλμ μΌλ‘ μ μΌ μλ‘ μ¬λΌκ°κ² λλ κ²μ μλ―Ένλ€.
λͺ¨λ ν¨μμ μ μΈμ νΈμ΄μ€ν λλ€.
console.log(1)
console.log(2)
console.log(3)
1, 2, 3 μμλλ‘ μ°νλ κ²μ νμΈ ν μ μλ€.
λΉλκΈ° μ²λ¦¬ (Asynchronous) μ λνμ API λ setTimeout() μ΄ μλ€.
setTimeout() λ λΈλΌμ°μ API λ‘, μΌμ μκ°μ΄ μ§λλ©΄ μ§μ ν μ½λ°±ν¨μλ₯Ό νΈμΆνκ² λλ€.
μλ λΉλκΈ°μ μΈ μ€ν λ°©λ²μ 보λλ‘ νμ.
console.log(1)
setTimeout(function() {
console.log(2)
}, 1000)
console.log(3)
// 1, 3, 2 μμλ‘ μ°νλ€.
λλ²μ§Έ μ€ setTimeout μ ν¨μ νΈμ΄μ€ν μ μν΄ λ§¨ μλ‘ μ¬λΌκ° μνμμ
1μ΄ λ¨Όμ μ½μμ°½μ μΆλ ₯λκ³ setTimeout μ μ½λ°± ν¨μλ λΈλΌμ°μ μκ²
β1μ΄ λ€ μ½λ°±ν¨μλ₯Ό μ€νν΄μ€!β
λΌκ³ λΈλΌμ°μ μκ² μμ²μ λ£κ² λλ€.
λ°λ‘ λ€μ΄μ΄ μ«μ 3μ΄ μΆλ ₯λκ³ 1μ΄ λ€, μ½λ°±ν¨μκ° μ€νλμ΄ (Timehandler μν ) λλμ΄ μ«μ 2κ° μΆλ ₯λλ€.
νλμ Parameter μ λ€μ΄κ°λ ν¨μ, μ§κΈ λΉμ₯ μ€ννμ§λ μκ³ λͺ μ΄ λ€μ λ΄ ν¨μλ₯Ό μ½ (call) ν΄μ€!
λΌκ³ μ λ¬νλ κ²μ μλ―Ένλ€. Callback, μ£Όλ‘ Arrow function μ μ¬μ©ν΄μ λμ€μ λ€μ λΆλ¬λ¬λΌκ³ νλ κ²μ΄λ€.
κ·Έλ¬λ©΄ μ½λ°±μ νμ λΉλκΈ° μ μΌ λλ§ μΈκΉ? No!
첫λ²μ§Έ, λκΈ° μ½λ°±μ print λΌλ μ½λ°±ν¨μλ₯Ό νλΌλ―Έν°λ‘ λ°μμ μ€ννλ€.
function printImmediately(print) {
print()
}
// μ ν¨μμ μ μΈμ ν΅ν΄ ν¨μμ μ μΈμ μ μΌ μλ‘ (Hoisting) μ¬λ¦°λ€.
printImmediately(() => console.log('Hello'))
1, 3, Hello, 2 μμλ‘ μ°νλ€. μ?
console.log(1)
setTimeout(function() {
console.log(2)
}, 1000)
console.log(3)
printImmediately(() => console.log('Hello'))
Hoisting μ λ°λΌ μ μΈν μμ κ³ λλ‘ μΆλ ₯λλ€.
κ·Έλμ 1, 3, Hello, 2 μμλ‘ μΆλ ₯λλ€.
λλ²μ§Έ, λΉλκΈ° μ½λ°±ν¨μλ₯Ό μ μΈ λ° μ€νν΄ λ³΄μλ€.
function printWithDelay(print, timeout) {
setTimeout(print, timeout)
}
printWithDelay(() => console.log('Async Callback'), 2000)
// μ΄μ 1, 3, Hello, 2, Async Callback μΌλ‘ μ°νλ€.
μκΉμ λμ λ λ°μ΄ν°λ₯Ό λ€μ λΆλ¬μ 보면,
console.log(1)
setTimeout(function() {
console.log(2)
}, 1000)
console.log(3)
printImmediately(() => console.log('Hello'))
printWithDelay(() => console.log('Async Callback'), 2000)
1, 3, Hello, 2, Async Callback μμΌλ‘ μΆλ ₯λλ μ΄μ μ λν΄ μκΈν μ μλ€.
class UserStorage {
loginUser(id, password, onSuccess, onError) {
setTimeout(() => {
if (
(id === 'seolleung' && password === 'daechidongganggunma') ||
(id === 'gdragon' && password === 'yakkuk')
) {
onSuccess(id)
} else {
onError(new Error('not Found'))
}
}, 2000)
}
getRoles(user, onSuccess, onError) {
setTimeout(() => {
if (user === 'seolleung') {
onSuccess({ name: 'seolleung', role: 'admin' })
} else {
onError(new Error('No Access'))
}
}, 1000)
}
}
loginUser ν¨μλ id μ password λ₯Ό λ°κ³ , μ¬μ©μμ λ°μ΄ν° (id λ password κ° μΌμΉνλ) κ° μ ν©ν λ
μ¬μ©μ λ°μ΄ν°μ ν¨κ» onSuccess λΌλ μ½λ°±ν¨μλ₯Ό νΈμΆνκ³ , μ ν©νμ§ μμ λλ onError λΌλ μ½λ°±ν¨μλ₯Ό ν΅ν΄
μλ¬ λ©μμ§λ₯Ό 보μ΄λλ‘ ν κ²μ΄λ€.
loginUser ν¨μ λ΄ setTimeout μ 첫λ²μ§Έ μΈμλ‘ μ½λ°±ν¨μκ° μ€κ³ , κ·Έ μ½λ°±ν¨μμ μν μ
μ¬μ©μ λ°μ΄ν°λ₯Ό λ°μμ Admin λλ guest κΆνμΈμ§λ₯Ό λ°μμ€λ μν μ λ΄λΉνλ€.
ν΄λΉ λ‘κ·ΈμΈ μ μ μ€μ μΌμΉνλ μ μ κ° μλ€λ©΄, onSuccess ν¨μλ₯Ό ν΅ν΄ μ μ μ μν μ λ΄μ κ°μ²΄λ₯Ό 리ν΄νλ€.
const userStorage = new UserStorage()
const id = prompt('Enter your ID')
const password = prompt('Enter your Password')
userStorage.loginUser(
id,
password,
user => {
userStorage.getRoles(
user,
userWithRole => {
alert(
`Hello ${userWithRole.name}, you have a ${userWithRole.role} role`
)
},
error => {
console.log(error)
}
)
},
error => {
console.log(error)
}
)