1. callback μ§μ₯μ λ²μ΄λμ!2. Promise3. μ€μ μμ 4. async, await(μμ΄μ½ν¬, μ΄μ¨μ)5. νΈμΆμ€ν
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 κ΅κ³Όμ' κΈ°μ€μΌλ‘ μ€λͺ μΌλ‘ μ€λͺ ν΄λ리λλ‘ νκ² μ΅λλ€.
Β
console.log(1); setTimeout(μ€ν, 1000) console.log(3); function μ€ν(){ console.log(2); }
- λ©λͺ¨λ¦¬μ μ€νν¨μ μ μ¬
- νΈμΆμ€νμ anonymous λ€μ΄κ°
- console.log(1)μ΄ νΈμΆ μ€νμ μμ
- console.log(1)μ΄ μ€νλμ΄ consoleμ 1μ μ°κ³ μ€νμμ μ¬λΌμ§
- λ°±κ·ΈλΌμ΄λμ timer(μ€ν, 1) (κ³μ μκ°μ μΉ΄μ΄ν νλ μ€)
- console.log(3)μ΄ μ€νμ μμ
- console.log(3)μ΄ μ€νλμ΄ consoleμ 3λ₯Ό μ°κ³ μ€νμμ μ¬λΌμ§
- anonymous μ¬λΌμ§
- 1μ΄κ° μ§λκ°λ©΄ λ°±κ·ΈλΌμ΄λμμ νμ€ν¬ νλ‘ 'μ€ν' ν¨μλ₯Ό κ°μ Έμ΄(λ°±κ·ΈλΌμ΄λμμ μμ΄μ§)
- νμ€ν¬ νμμ μ€νν¨μλ₯Ό νΈμΆ μ€νμΌλ‘ κ°μ Έμ΄
- 'μ€ν'ν¨μ μμ console.log(2)κ° μμ
- console.log(2)μ΄ μ€νλμ΄ consoleμ 2λ₯Ό μ°κ³ μ€νμμ μ¬λΌμ§
- 'μ€ν' ν¨μκ° νΈμΆ μ€νμμ μ¬λΌμ§
Β
μ°Έκ³ μμ
Β
Β
(μ€μ΅) μ€μ λ‘κ·ΈμΈ νμ΄μ§ λ§λ€κΈ°!
[ '{{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("μμΉ", "μΌλ°", "μ€λ²", "골λ", "λ€μ΄μλͺ¬λ", "κ΄λ¦¬μ")}}' } ]
Β