์ฝ๋ฐฑ ์ง์ฅ๊ณผ ๋น๋๊ธฐ ์ ์ด
์ฝ๋ฐฑ ์ง์ฅ
- ์ฝ๋ฐฑ ํจ์๋ฅผ ์ต๋ช
ํจ์๋ก ์ ๋ฌํ๋ ๊ณผ์ ์ด ๋ฐ๋ณต๋์ด ์ฝ๋์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊ฐ๋นํ๊ธฐ ํ๋ค ์ ๋๋ก ๊น์ด์ง๋ ํ์
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์
- ์ฃผ๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ์๋ฒ ํต์ ๊ณผ ๊ฐ์ด ๋น๋๊ธฐ์ ์ธ ์์
์ ์ํํ๊ธฐ ์ํ ์ฝ๋์์ ๋ฐ์
- ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ๋ฟ ๋๋ฌ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ๋ ์ด๋ ค์
๋๊ธฐ์ ๋น๋๊ธฐ
๋๊ธฐ์ ์ธ ์ฝ๋
- ํ์ฌ ์คํ ์ค์ธ ์ฝ๋๊ฐ ์๋ฃ ๋ ํ์์ผ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ์
- CPU์ ๊ณ์ฐ์ ์ํด ์ฆ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๋๋ถ๋ถ์ ์ฝ๋
๋น๋์ ์ธ ์ฝ๋
- ํ์ฌ ์คํ ์ค์ธ ์ฝ๋์ ์๋ฃ ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ์ฆ์ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ
- setTimeout : ์ฌ์ฉ์์ ์์ฒญ์ ์ํด ํน์ ์๊ฐ์ด ๊ฒฝ๊ณผ๋๊ธฐ ์ ๊น์ง ์ด๋ค ํจ์์ ์คํ์ ๋ณด๋ฅ
- addEventListener : ์ฌ์ฉ์์ ์ง์ ์ ์ธ ๊ฐ์
์ด ์์ ๋ ๋น๋ก์ ์ด๋ค ํจ์๋ฅผ ์คํ์ ๋ณด๋ฅ
- XMLHttpRequest : ์น๋ธ๋ผ์ฐ์ ์์ฒด๊ฐ ์๋ ๋ณ๋์ ๋์์ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฒญํ๊ณ ๊ทธ์ ๋ํ ์๋ต์ด ์์ ๋ ๋น๋ก์ ์ด๋ค ํจ์๋ฅผ ์คํํ๋๋ก ๋๊ธฐ
- ์น์ ๋ณต์ก๋๊ฐ ๋์์ง๋ฉด์ ๋น๋๊ธฐ์ ์ธ ์ฝ๋์ ๋น์ค์ด ๋์์ก๊ณ , ๊ทธ์ ๋ฐ๋ผ ์ฝ๋ฐฑ ์ง์ฅ์ ๋น ์ง๊ธฐ๋ ์ฌ์์ง
์์ - ์ฝ๋ฐฑ ์ง์ฅ
setTimeout(function (name) {
let coffeeList = name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
}, 500, '์นดํ๋ผ๋ผ');
}, 500, '์นดํ๋ชจ์นด');
}, 500, '์๋ฉ๋ฆฌ์นด๋
ธ');
}, 500, '์์คํ๋ ์');
- ๋ชฉ์ ๋ฌ์ฑ์๋ ์ง์ฅ์ด ์์ง๋ง ๋ค์ฌ์ฐ๊ธฐ ์์ค์ด ๊ณผ๋ํ๊ฒ ๊น์ด์ง
- ๊ฐ์ด ์ ๋ฌ๋๋ ์์๊ฐ '์๋์์ ์๋ก' ํฅํ๊ณ ์์ด ์ด์ํ๊ฒ ๋๊ปด์ง
์์ - ์ฝ๋ฐฑ ์ง์ฅ ํด๊ฒฐ / ๊ธฐ๋ช
ํจ์๋ก ๋ณํ
let coffeeList = '';
const addEspresso = function (name) {
coffeeList = name;
console.log(coffeeList);
setTimeout(addAmericano, 500, '์๋ฉ๋ฆฌ์นด๋
ธ');
};
const addAmericano = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(addMocha, 500, '์นดํ๋ชจ์นด');
};
const addMocha = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
setTimeout(addLatte, 500, '์นดํ๋ผ๋ผ');
};
const addLatte = function (name) {
coffeeList += ', ' + name;
console.log(coffeeList);
};
setTimeout(addEspresso, 500, '์์คํ๋ ์');
- ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋์
- ํจ์ ์ ์ธ๊ณผ ํจ์ ํธ์ถ๋ง ๊ตฌ๋ถํ ์ ์๋ค๋ฉด ์์์๋ถํฐ ์๋๋ก ์์๋๋ก ์ฝ์ด ๋ด๋ ค๊ฐ๋๋ฐ ์ด๋ ค์์ด ์์
์์ - ๋น๋๊ธฐ ์์
์ ๋๊ธฐ์ ํํ
- ES6(ES2015)์์ Promise, Generator ๋ฑ์ด ๋์
- ES8(ES2017)์์ async / await ์ด ๋์
Promise(1)
new Promise(function (resolve) {
setTimeout(function () {
const name = '์์คํ๋ ์';
console.log(name);
resolve(name);
}, 500);
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', ์๋ฉ๋ฆฌ์นด๋
ธ';
console.log(name);
resolve(name);
}, 500);
});
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', ์นดํ๋ชจ์นด';
console.log(name);
resolve(name);
}, 500);
});
}).then(function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const name = prevName + ', ์นดํ๋ผ๋ผ';
console.log(name);
resolve(name);
}, 500);
});
})
- new ์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ Promise์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ์ฝ๋ฐฑ ํจ์๋ ํธ์ถํ ๋ ๋ฐ๋ก ์คํ
- ๊ทธ ๋ด๋ถ์ resolve ๋๋ reject ํจ์๋ฅผ ํธ์ถํ๋ ๊ตฌ๋ฌธ์ด ์์ ๊ฒฝ์ฐ ๋ ์ค ํ๋๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ then ๋๋ catch ๋ก ๋์ด๊ฐ์ง ์์
Promise(2)
const addCoffee = function (name) {
return function (prevName) {
return new Promise(function (resolve) {
setTimeout(function () {
const newName = prevName ? (prevName + ', ' + name) : name;
console.log(newName);
resolve(newName);
}, 500);
});
}
};
addCoffee('์์คํ๋ ์')()
.then(addCoffee('์๋ฉ๋ฆฌ์นด๋
ธ'))
.then(addCoffee('์นดํ๋ชจ์นด'))
.then(addCoffee('์นดํ๋ผ๋ผ'))
- ๋ฐ๋ณต์ ์ธ ๋ด์ฉ์ ํจ์ํํด์ ๋์ฑ ์งง๊ฒ ํํ
Generator
const addCoffee = function (prevName, name) {
setTimeout(function () {
coffeeMaker.next(prevName ? prevName + ', ' + name : name);
}, 500);
};
const coffeeGenerator = function* () {
const espresso = yield addCoffee('', '์์คํ๋ ์');
console.log(espresso);
const americano = yield addCoffee(espresso, '์๋ฉ๋ฆฌ์นด๋
ธ');
console.log(americano);
const mocha = yield addCoffee(americano, '์นดํ๋ชจ์นด');
console.log(mocha);
const latte = yield addCoffee(mocha, '์นดํ๋ผ๋ผ');
console.log(latte);
};
const coffeeMaker = coffeeGenerator();
coffeeMaker.next();
- ES6์ Generator๋ฅผ ์ด์ฉ
- '*'์ด ๋ถ์ ํจ์๊ฐ Generator
- Generator ํจ์๋ฅผ ์คํํ๋ฉด Iterator๊ฐ ๋ฐํ๋๊ณ , Iterator๋ next๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์
- next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Generator ํจ์ ๋ด๋ถ์์ ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํ๋ yield์์ ํจ์์ ์คํ์ ๋ฉ์ถค
- ์ดํ ๋ค์ next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์ ๋ฉ์ท๋ ๋ถ๋ถ๋ถํฐ ์์ํด์ ๊ทธ ๋ค์์ ๋ฑ์ฅํ๋ yield์์ ํจ์์ ์คํ์ ๋ฉ์ถค
- ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋๋ ์์ ๋ง๋ค next ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Generator ํจ์ ๋ด๋ถ์ ์์ค๊ฐ ์์์๋ถํฐ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์งํ ๋จ
Promise + Async/Await
const addCoffee = function (name) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(name);
}, 500);
});
};
const coffeeMaker = async function () {
let coffeeList = '';
const _addCoffee = async function (name) {
coffeeList += (coffeeList ? ',' : '') + await addCoffee(name);
};
await _addCoffee('์์คํ๋ ์');
console.log(coffeeList);
await _addCoffee('์๋ฉ๋ฆฌ์นด๋
ธ');
console.log(coffeeList);
await _addCoffee('์นดํ๋ชจ์นด');
console.log(coffeeList);
await _addCoffee('์นดํ๋ผ๋ผ');
console.log(coffeeList);
};
coffeeMaker();
- ES8(ES2017)์์ ๊ฐ๋
์ฑ์ด ๋ฐ์ด๋๋ฉด์ ์์ฑ๋ฒ๋ ๊ฐ๋จํ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ
- ๋น๋๊ธฐ ์์
์ ์ํํ๊ณ ์ ํ๋ ํจ์ ์์ async ํ๊ธฐ, ํจ์ ๋ด๋ถ์์ ์ค์ง์ ์ธ ๋น๋๊ธฐ ์์
์ด ํ์ํ ์์น๋ง๋ค await ํ๊ธฐ
- await ๋ค์ ๋ด์ฉ์ด Promise๋ก ์๋ ์ ํ, ํด๋น ๋ด์ฉ์ด resolve ๋ ์ดํ์์ผ ๋ค์์ผ๋ก ์งํ