πŸ“

14. promise, async, await

1. callback 지μ˜₯을 λ²—μ–΄λ‚˜μž!

  • 콜백 ν•¨μˆ˜λŠ” μ•„λž˜μ²˜λŸΌ λ‚˜μ€‘μ— μ‹€ν–‰ν•  ν•¨μˆ˜!
const λ²„νŠΌ = document.querySelector('.button'); λ²„νŠΌ.addEventListener('click', function(){}); // λ²„νŠΌ.addEventListener('click', 'λ‹€λ₯Έ κ³³μ—μ„œ μ§  ν•¨μˆ˜μ΄λ¦„'); // ex('click', helloworld100) // function helloworld100() { // console.log('hello world'); // console.log('hello world'); // } // λ²„νŠΌ.addEventListener('click', ()=>{});
function ν•¨μˆ˜ν•˜λ‚˜(좜λ ₯){ console.log('hello'); 좜λ ₯('world'); } ν•¨μˆ˜ν•˜λ‚˜(console.log);
Β 
  • μœ„μ— μ½”λ“œκ°€ μž‘μ„±μ΄ λ˜λŠ” μ΄μœ λŠ” ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œλŠ” κ²°κ΅­ μ–΄λ–€ κΈ°λŠ₯을 가리킀고 μžˆλŠ” μ‹λ³„μžμ΄κΈ° λ•Œλ¬Έ
let hojun = console.log; hojun('hello world');
Β 
  • ν•¨μˆ˜ ν•˜λ‚˜κ°€ 둜그인 κΈ°λŠ₯μ΄μ—ˆκ³ , 이 둜그인 κΈ°λŠ₯ 이후에 κ³„μ’Œ 연동, 이미지 λ‘œλ“œ λ“±μ˜ κΈ°λŠ₯이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 μ—¬λŸ¬ ν•¨μˆ˜λ“€μ˜ 쀑첩이 일어남
function 둜그인(){ if (λ‘œκ·ΈμΈμ„±κ³΅) { μ΄λ―Έμ§€λ‘œλ“œ(); κ³„μ’Œμ—°λ™(...κ³„μ’Œμ—°λ™ 이후 μΌμ–΄λ‚˜λŠ” μ½”λ“œ...); ... } }
Β 
  • μ΄λ ‡κ²Œ μ—°κ²°λœ 것을 μ•„λž˜μ²˜λŸΌ ν’€μ–΄λ‚Ό 수 있음
user.login( id, pw, λ‘œκ·ΈμΈμ„±κ³΅, λ‘œκ·ΈμΈμ‹€νŒ¨, μ΄λ―Έμ§€λ‘œλ“œ, κ³„μ’Œμ—°λ™...)
Β 
  • μ—¬κΈ°μ„œλŠ” μ½œλ°±μ§€μ˜₯(callback hell)이 잘 감이 μ•ˆμ˜€μ§€λ§Œ μ•„λž˜μ²˜λŸΌ μ‹€μ œ μ½”λ“œλ‘œ 짜보면 감이옴.
userData.login( id, pw, (user) => { userData.getData( user, (userData) => { ..μ½œλ°±μ— 콜백.. }, (fail) => { ..μ½œλ°±μ— 콜백.. } ); }, (fail) => { ..μ½œλ°±μ— 콜백.. }, (user) => { //이미지 λ‘œλ“œ ..μ½œλ°±μ— 콜백.. }, (user) => { // κ³„μ’Œ 연동 ..μ½œλ°±μ— 콜백.. }, );
Β 
  • 콜백 지μ˜₯ μ½”λ“œ μ²΄ν—˜(λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제)
Β 
Β 

2. Promise

  • μ΄λŸ¬ν•œ 콜백 지μ˜₯을 νƒˆμΆœν•  수 있게 λ§Œλ“€μ–΄μ£ΌλŠ” 것이 promise!
  • promiseλŠ” μ–Έμ œ λ‚΄κ°€ 널(μ½œλ°±ν•¨μˆ˜) λ‹€μ‹œ λΆˆλŸ¬μ€„μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ, μ–Έμ  κ°€ 널 λ‹€μ‹œ λΆˆλŸ¬μ£Όκ² λ‹€ μ•½μ†ν•˜κ² λ‹€λŠ” 뜻
  • λ…Έλ“œλ₯Ό ν•˜μ‹€ 것이라면 λ°˜λ“œμ‹œ μ•Œμ•„μ•Ό 함!
  • (2022λ…„μ—λŠ” λŒ€λΆ€λΆ„) (promiseλ₯Ό μ—¬λŸ¬κ°œ μ‹€ν–‰ν•  수 μžˆλŠ”) Promise.allλ³΄λ‹€λŠ” allSettled(μ‹€νŒ¨ν•œ κ²ƒλ§Œ μΆ”λ €λ‚΄λŠ” κΈ°λŠ₯이 있음)λ₯Όμ‚¬μš©ν•  κ²ƒμœΌλ‘œ λ³΄μž„
let p = new Promise(function(resolve, reject) { // μ‹€ν–‰μ½”λ“œ }); // resolve(value) β€” μž‘μ—…μ΄ μ„±κ³΅μ μœΌλ‘œ 마무리되면 호좜, κ²°κ³ΌλŠ” value에 λ‹΄κΉ€ // reject(error) β€” μž‘μ—…μ΄ μ‹€νŒ¨μ‹œ 호좜, errorλŠ” error에 λ‹΄κΉ€
Β 
// μ‰¬μš΄ 예제 let p = new Promise(function(resolve, reject) { resolve('hello world'); }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€.split(' ')[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); }); let p = new Promise(function(resolve, reject) { // resolve('hello world'); reject('hello world'); }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€.split(' ')[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); }).catch(λ©”μ‹œμ§€ => { alert('catch μ‹€ν–‰!! :' + λ©”μ‹œμ§€); }); let p = new Promise(function(resolve, reject) { // resolve('hello world'); reject('hello world'); }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€.split(' ')[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); }).catch(λ©”μ‹œμ§€ => { alert('catch μ‹€ν–‰!! :' + λ©”μ‹œμ§€); }); let p = new Promise(function(resolve, reject) { // resolve('hello world'); reject('hello world'); }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); throw Error("μ—λŸ¬ λ°œμƒ!") return λ©”μ‹œμ§€.split(' ')[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); }).catch(λ©”μ‹œμ§€ => { alert('catch μ‹€ν–‰!! :' + λ©”μ‹œμ§€); }); let p = new Promise(function(resolve, reject) { // resolve('hello world'); // reject('hello world'); resolve('hello world'); }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); throw Error("μ—λŸ¬ λ°œμƒ!") return λ©”μ‹œμ§€.split(' ')[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); return λ©”μ‹œμ§€[0] }).then(λ©”μ‹œμ§€ => { alert(λ©”μ‹œμ§€); }).catch(λ©”μ‹œμ§€ => { alert('catch μ‹€ν–‰!! :' + λ©”μ‹œμ§€); });
  • console.log둜 promiseλ₯Ό μ°μ–΄λ³΄μ„Έμš”.
  • μ™œ ν•˜λƒκ³ μš”? 비동기가 ν•΅μ‹¬μž…λ‹ˆλ‹€.
  • 성곡과 μ‹€νŒ¨λ§Œ ν•©λ‹ˆλ‹€. 쀑립은 μ—†μŠ΅λ‹ˆλ‹€. λŒ€κΈ°(pending)λŠ” μžˆμŠ΅λ‹ˆλ‹€.
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 let promise = new Promise(function(resolve, reject) { // ν”„λΌλ―ΈμŠ€κ°€ λ§Œλ“€μ–΄μ§€λ©΄ executor ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. // 1초 뒀에 일이 μ„±κ³΅μ μœΌλ‘œ λλ‚¬λ‹€λŠ” μ‹ ν˜Έκ°€ μ „λ‹¬λ˜λ©΄μ„œ resultλŠ” 'done'이 λ©λ‹ˆλ‹€. setTimeout(() => resolve("끝남!"), 1000); }); console.log('hello world'); console.log(promise);
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 (살짝 μˆ˜μ •) let promise = new Promise(function(resolve, reject) { // ν”„λΌλ―ΈμŠ€κ°€ λ§Œλ“€μ–΄μ§€λ©΄ executor ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. // 1초 뒀에 일이 μ„±κ³΅μ μœΌλ‘œ λλ‚¬λ‹€λŠ” μ‹ ν˜Έκ°€ μ „λ‹¬λ˜λ©΄μ„œ resultλŠ” 'done'이 λ©λ‹ˆλ‹€. setTimeout(() => resolve("μ΄μ œμ•Ό 끝남!"), 10000); }); console.log('hello world'); console.log(promise);
let promise = new Promise(function(resolve, reject) { // ν”„λΌλ―ΈμŠ€κ°€ λ§Œλ“€μ–΄μ§€λ©΄ executor ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. // 1초 뒀에 일이 μ„±κ³΅μ μœΌλ‘œ λλ‚¬λ‹€λŠ” μ‹ ν˜Έκ°€ μ „λ‹¬λ˜λ©΄μ„œ resultλŠ” 'done'이 λ©λ‹ˆλ‹€. setTimeout(() => resolve(console.log('데이터λ₯Ό μ„±κ³΅μ μœΌλ‘œ λ°›μ•„μ˜΄')), 1000); }); console.log('hello world');
  • μΌλΆ€λŸ¬ μ—λŸ¬λ₯Ό λ˜μ Έμ€„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 (살짝 μˆ˜μ •) let promise = new Promise(function(resolve, reject) { // 1초 뒀에 μ—λŸ¬μ™€ ν•¨κ»˜ 싀행이 μ’…λ£Œλ˜μ—ˆλ‹€λŠ” μ‹ ν˜Έλ₯Ό λ³΄λƒ…λ‹ˆλ‹€. setTimeout(() => reject("μ—λŸ¬μ—λŸ¬!!"), 3000); });
let promise = new Promise(function(resolve, reject) { // 1초 뒀에 μ—λŸ¬μ™€ ν•¨κ»˜ 싀행이 μ’…λ£Œλ˜μ—ˆλ‹€λŠ” μ‹ ν˜Έλ₯Ό λ³΄λƒ…λ‹ˆλ‹€. setTimeout(() => reject(new Error("μ—λŸ¬ λ°œμƒ!")), 3000); });
// μ‹€ν–‰ν•˜μ§€ λ§ˆμ„Έμš”. pending에 λΉ μ§‘λ‹ˆλ‹€. let promise = new Promise(function(resolve, reject) { console.log('hello world') });
Β 
  • 전체적인 λͺ¨μŠ΅μ€ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€. 싀행이 λ˜λŠ” μ½”λ“œλŠ” Nodeμ—μ„œ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
new Promise((resolve, reject) => {...code...}) .then(...code...) .then(...code...) .finally(...code...) .catch(...code...); // <-- .catchμ—μ„œ μ—λŸ¬ 객체λ₯Ό λ‹€λ£° 수 있음
Β 
  • μ•„λž˜ μ½”λ“œλ₯Ό μ½˜μ†”μ—μ„œ μ‹€ν–‰ν•΄λ³΄μ„Έμš”.
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 new Promise(function(resolve, reject) { setTimeout(() => resolve(1), 1000); // (*) }).then(function(result) { // (**) alert(result); // 1 return result * 2; }).then(function(result) { // (***) alert(result); // 2 return result * 2; }).then(function(result) { alert(result); // 4 return result * 2; });
Β 
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 (살짝 μˆ˜μ •) new Promise(function(resolve, reject) { setTimeout(() => reject('error'), 1000); }).then(function(result) { alert(result + ' : 잘 μˆ˜ν–‰!'); return result + 'one'; }).catch(function(result) { alert(result + ' : μ• λŸ¬ λ°œμƒ!'); // 1 return result + 'two'; }).then(function(result) { alert(result + ' : 잘 μˆ˜ν–‰!'); // 2 return result + 'three'; });
Β 
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 let p = new Promise(function(resolve, reject) { setTimeout(() => resolve(1), 10000); // (*) }); console.log('hello world'); let p2 = p.then(function(result) { // (**) console.log(result); // 1 return result * 2; }); console.log('hello world2'); let p3 = p2.then(function(result) { // (***) console.log(result); // 2 return result * 2; }); console.log('hello world3'); let p4 = p3.then(function(result) { console.log(result); // 4 return result * 2; });
  • λ‹€μŒ μ˜ˆμ œλŠ” ν”„λΌλ―ΈμŠ€ 체이닝이 μ•„λ‹˜!
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 let promise = new Promise(function(resolve, reject) { setTimeout(() => resolve(1), 1000); }); promise.then(function(result) { alert(result); // 1 return result * 2; }); promise.then(function(result) { alert(result); // 1 return result * 2; }); promise.then(function(result) { alert(result); // 1 return result * 2; });
Β 
  • λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ½œλ°±ν•¨μˆ˜ μ• λŸ¬μ²˜λ¦¬
// λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ // 정리 μ „ 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 { // λͺ¨λ“  μŠ€ν¬λ¦½νŠΈκ°€ λ‘œλ”©λœ ν›„, μ‹€ν–‰ 흐름이 μ΄μ–΄μ§‘λ‹ˆλ‹€. (*) } }); } }) } }); // 정리 ν›„ loadScript("/article/promise-chaining/one.js") .then(script => loadScript("/article/promise-chaining/two.js")) .then(script => loadScript("/article/promise-chaining/three.js")) .then(script => { // 슀크립트λ₯Ό μ •μƒμ μœΌλ‘œ λΆˆλŸ¬μ™”κΈ° λ•Œλ¬Έμ— 슀크립트 λ‚΄μ˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. one(); two(); three(); });

3. μ‹€μ „μ˜ˆμ œ

  • μ•„λž˜ 예제λ₯Ό 확인해보면 1κ³Ό 2κ°€ 좜λ ₯되고 λ‚˜μ€‘μ— console.logκ°€ 좜λ ₯이 되기 λ•Œλ¬Έμ— λΉ„λ™κΈ°λΌλŠ” 것을 μ•Œ μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.
fetch('https://raw.githubusercontent.com/paullabkorea/coronaVaccinationStatus/main/data/data.json') .then(function(response) { return response.json(); }) .then(function(json) { console.log(json); return json }) console.log(1); console.log(2);
  • μ‹€μ „μ˜ˆμ œ
fetch('https://raw.githubusercontent.com/paullabkorea/coronaVaccinationStatus/main/data/data.json') .then(function(response) { console.log(1); return response.json(); }) .then(function(json) { console.log(2); console.log(json); return json }) .then(function(json) { console.log(3); console.log(json.filter(s => s['μ‹œΒ·λ„λ³„(1)'] === 'μ „κ΅­')); return })
// 1μ°¨ μ ‘μ’… νΌμ„ΌνŠΈλ₯Ό κ΅¬ν•΄μ£Όμ„Έμš”! fetch('https://raw.githubusercontent.com/paullabkorea/coronaVaccinationStatus/main/data/data.json') .then(function(response) { console.log(1); return response.json(); }) .then(function(json) { console.log(2); console.log(json); return json }) .then(function(json) { console.log(3); console.log(json.filter(s => s['μ‹œΒ·λ„λ³„(1)'] === 'μ „κ΅­').map(obj => obj['1μ°¨ μ ‘μ’… νΌμ„ΌνŠΈ'])); return })
fetch('https://raw.githubusercontent.com/paullabkorea/coronaVaccinationStatus/main/data/data.json') .then(function(response) { console.log(1); throw Error('μ• λŸ¬λ‚¬μ–΄μœ !') return response.json(); }) .then(function(json) { console.log(2); console.log(json); return json }) .then(function(json) { console.log(3); console.log(json.filter(s => s['μ‹œΒ·λ„λ³„(1)'] === 'μ „κ΅­')); return }) .catch(err => alert(err))
Β 

4. async, await(에이씽크, μ–΄μ›¨μž‡)

  • Ajax도 μ—μ΄μž‘μŠ€μ£ ? 이거 어싱크라고 ν•˜μ‹œλŠ” 뢄이 λ§ŽμŠ΅λ‹ˆλ‹€.
  • 일뢀 λŸ°νƒ€μž„μ—μ„œλŠ” async 없이도 await을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•žμœΌλ‘œλŠ” λ‹€λ₯Έ λŸ°νƒ€μž„λ„ κ·Έλ ‡κ²Œ 될 κ²ƒμ΄κ³ μš”. (top level await)
// λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 async function f() { return 100; } f().then(alert); // 100
Β 
// λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 (살짝 μˆ˜μ •) async function f() { return 100; } f().then(function(result) { // (**) alert(result); // 1 return result * 2; }).then(function(result) { // (***) alert(result); // 2 return result * 2; }).then(function(result) { alert(result); // 4 return result * 2; });
Β 
  • await은 (크둬을 μ œμ™Έν•œ λΈŒλΌμš°μ €μ˜ λŸ°νƒ€μž„) 일반 ν•¨μˆ˜μ—μ„œλŠ” μ‚¬μš©μ΄ λΆˆκ°€ν•©λ‹ˆλ‹€.
// λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 async function f() { let promise = new Promise((resolve, reject) => { setTimeout(() => resolve("μ™„λ£Œ!"), 1000) }); let result = await promise; // ν”„λΌλ―ΈμŠ€κ°€ 이행될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦Ό (*) alert(result); // "μ™„λ£Œ!" } f();
Β 
  • μ‹œκ°„μ„ 3초둜 ν•˜μ—¬ μ–΄λ–€ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ”μ§€ λ΄…μ‹œλ‹€.
// λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 예제 (살짝 μˆ˜μ •) async function f() { let promise = new Promise((resolve, reject) => { setTimeout(() => resolve("μ™„λ£Œ!"), 3000) }); let result = await promise; // ν”„λΌλ―ΈμŠ€κ°€ 이행될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦Ό (*) alert(result); // "μ™„λ£Œ!" return 100 } f().then(function(result) { // (**) alert(result); // 1 return result * 2; }).then(function(result) { // (***) alert(result); // 2 return result * 2; }).then(function(result) { alert(result); // 4 return result * 2; });
Β 
// λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 잘λͺ»λœ 예제 (https://ko.javascript.info/async-await) // λ³΄λΌλ‹˜μ—κ²Œ μ œλ³΄ν•΄μ£Όμ„Έμš”.γ…Žγ…Ž μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ 보완이 λ˜μ–΄λ²ΌλŸ¬μ„œ 잘λͺ»λœ λ‚΄μš©μ΄ 된 κ²ƒμž…λ‹ˆλ‹€. let response = await fetch('https://raw.githubusercontent.com/paullabkorea/coronaVaccinationStatus/main/data/data.json'); let data = await response.json();
Β 
  • μΆ”κ°€λœ 문법
    • top-level-await
    • for await (λ³€μˆ˜ of ν”„λ‘œλ―ΈμŠ€λ°°μ—΄) 문법
    • Β 

Β 

5. ν˜ΈμΆœμŠ€νƒ

  • js μ½”λ“œ
function one(){ two(); } function two(){ three(); } function three(){ console.log('end'); }
  • (호좜 μŠ€νƒ) μŒ“μ΄λ©΄μ„œ ν•˜λ‚˜μ”© 빠짐
three() two() one() anonymous // 가상 μ „μ—­ μ»¨ν…μŠ€νŠΈ, 이것도 λ§ˆμ§€λ§‰μ— 빠짐
  • 그러면 μ•„λž˜ μ½”λ“œλŠ”?
console.log(1); setTimeout(function(){ console.log(2); }, 1000) // setTimeout(()=> console.log(2), 1000) console.log(3);
Β 

Β 
  • ν˜ΈμΆœμŠ€νƒμ΄ λͺ¨λ‘ λλ‚˜μ•Ό λ°±κ·ΈλΌμš΄λ“œ μ‹€ν–‰ν•©λ‹ˆλ‹€. 쀑간에 μ‹€ν–‰λ˜λŠ” 경우 μ—†μ–΄μš”.
  • 이벀트 루프λ₯Ό μ„€λͺ…ν•˜λŠ” μ˜μƒμ€ 맀우 많고, μ„€λͺ…이 μ‘°κΈˆμ”© λ‹€λ¦…λ‹ˆλ‹€. μ΄μœ λŠ” λŒ€λΆ€λΆ„μ΄ λ³΅μž‘ν•œ κ°œλ…μ„ λ‹¨μˆœν™” ν•΄μ„œ μ„€λͺ…ν•˜κ³  있기 λ•Œλ¬Έμ΄μ—μš”.
  • μ €λŠ” 'Node.js κ΅κ³Όμ„œ' κΈ°μ€€μœΌλ‘œ μ„€λͺ…μœΌλ‘œ μ„€λͺ…ν•΄λ“œλ¦¬λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
notion imagenotion image
Β 
console.log(1); setTimeout(μ‹€ν–‰, 1000) console.log(3); function μ‹€ν–‰(){ console.log(2); }
  1. λ©”λͺ¨λ¦¬μ— μ‹€ν–‰ν•¨μˆ˜ 적재
  1. ν˜ΈμΆœμŠ€νƒμ— anonymous 듀어감
  1. console.log(1)이 호좜 μŠ€νƒμ— μŒ“μž„
  1. console.log(1)이 μ‹€ν–‰λ˜μ–΄ console에 1을 찍고 μŠ€νƒμ—μ„œ 사라짐
  1. λ°±κ·ΈλΌμš΄λ“œμ— timer(μ‹€ν–‰, 1) (계속 μ‹œκ°„μ„ μΉ΄μš΄νŒ…ν•˜λŠ” 쀑)
  1. console.log(3)이 μŠ€νƒμ— μŒ“μž„
  1. console.log(3)이 μ‹€ν–‰λ˜μ–΄ console에 3λ₯Ό 찍고 μŠ€νƒμ—μ„œ 사라짐
  1. anonymous 사라짐
  1. 1μ΄ˆκ°€ μ§€λ‚˜κ°€λ©΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ νƒœμŠ€ν¬ 큐둜 'μ‹€ν–‰' ν•¨μˆ˜λ₯Ό κ°€μ Έμ˜΄(λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 없어짐)
  1. νƒœμŠ€ν¬ νμ—μ„œ μ‹€ν–‰ν•¨μˆ˜λ₯Ό 호좜 μŠ€νƒμœΌλ‘œ κ°€μ Έμ˜΄
  1. 'μ‹€ν–‰'ν•¨μˆ˜ μœ„μ— console.log(2)κ°€ μŒ“μž„
  1. console.log(2)이 μ‹€ν–‰λ˜μ–΄ console에 2λ₯Ό 찍고 μŠ€νƒμ—μ„œ 사라짐
  1. 'μ‹€ν–‰' ν•¨μˆ˜κ°€ 호좜 μŠ€νƒμ—μ„œ 사라짐
Β 
μ°Έκ³ μ˜μƒ
Β 

Β 
(μ‹€μŠ΅) μ‹€μ „ 둜그인 νŽ˜μ΄μ§€ λ§Œλ“€κΈ°!
[ '{{repeat(10, 7)}}', { _id: '{{objectId()}}', id: '{{firstName()}}', pw: '{{guid()}}', index: '{{index()}}', picture: 'http://placehold.it/32x32', age: '{{integer(20, 40)}}', eyeColor: '{{random("blue", "brown", "green")}}', name: '{{firstName()}} {{surname()}}', gender: '{{gender()}}', company: '{{company().toUpperCase()}}', email: '{{email()}}', phone: '+1 {{phone()}}', address: '{{integer(100, 999)}} {{street()}}, {{city()}}, {{state()}}, {{integer(100, 10000)}}', grade: '{{random("μƒˆμ‹Ή", "일반", "싀버", "κ³¨λ“œ", "닀이아λͺ¬λ“œ", "κ΄€λ¦¬μž")}}' } ]
Β