ES6+ Basic6
์ธํ๋ฐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ JavaScript ES6+ / ์ ์ธ๋
๋ณ๋ ฌ์ ๋ก์ง
๋ง์ ์์์ ์ฌ์ฉํด์ ๋น ๋ฅธ์ฒ๋ฆฌ
C.reduce, C.take
์ง์ฐ๋ ํจ์์ด์ ๋ณ๋ ฌ์ ์ผ๋ก ํ๊ฐํ๊ธฐ
const C = {};
// ์๋ฌด์ผ๋ ํ์ง์๋ ํจ์
function noop() {}
// catch ์๋ฌ ๋ฐฉ์ง
const catchNoop = ([...arr]) =>
(arr.forEach(a => a instanceof Promise ? a. catch(noop) : a), arr);
C.reduce = curry((f, acc, iter) => { iter ?
reduce(f, acc, catchNoop(iter)) :
reduce(f, catchNoop(acc));
});
C.take = curry((l, iter) => take(l, catchNoop(iter))));
const delay1000 = a => new Promise(resolve =>
setTimeout(() => resolve(a), 1000));
go([1, 2, 3, 4, 5],
L.map(a => delay1000(a * a)),
L.filter(a => delay1000(a % 2)),
C.take(2),
C.reduce(add),
log);
Promise.reject
ํ์.catch
๋ฅผ ํ๊ฒ ๋๋ฉด ์ ํํ๊ฒ ์๋ฌ ์ฒ๋ฆฌ๋ ๋์ง๋ง ์ด๋ฏธ ์ฐํ ์๋ฌ ๋ก๊ทธ๋ ์ด๋ป๊ฒ ํ ์ ์์๋ฐ๋ผ์ ๋ฏธ๋ฆฌ
.catch
๋ฅผ ํด์ฃผ๋ฉด ๋จ
์ฆ์ ๋ณ๋ ฌ์ ์ผ๋ก ํ๊ฐํ๊ธฐ C.map, C.filter
C.takeAll = C.take(Infinity);
C.map = curry(pipe(L.map, C.takeAll));
C.filter = curry(pipe(L.filter, C.takeAll));
C.map(a => delay1000(a * a), [1, 2, 3, 4]).then(log);
C.filter(a => delay1000(a % 2), [1, 2, 3, 4]).then(log);
async/await
๋น๋๊ธฐ์ ์ผ๋ก ์ผ์ด๋๋ ์ผ๋ค์ ๋๊ธฐ์ ์ธ ๋ฌธ์ฅ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ํค์๋
์ด๋ค ํจ์๋ฅผ awaitํ๊ธฐ ์ํด์๋ ํจ์๊ฐ Promise๋ฅผ ๋ฆฌํดํด์ผํจ
async ํจ์๋ฅผ ์ ์ธํ๋ฉด ์ด๋ค ๊ฐ์ returnํ๋ Promise๋ฅผ ๋ฆฌํดํจ
function delay(a) {
return new Promise(resolve => setTimeout(() => reselve(a), 500));
}
async function f1() {
const a = await delay(10);
const b = await delay(5);
log(a + b);
}
// f1();
// f1().then(log);
// go(f1(), log);
// ์๋์ ๊ฐ์ด๋ ์ฌ์ฉ๊ฐ๋ฅ
const pa = Promise.resolve(10);
(async () => {
log(await pa);
});
Array.prototype.map์ด ์๋๋ฐ ์ FxJS์ map ํจ์๊ฐ ํ์ํ์ง?
Array.prototype.mapํจ์ ์์ฒด๊ฐ ๋น๋๊ธฐ๋ฅผ ์ ์ ์ด ํ ์ ์์(async/await๋ฅผ ์ ์ฌ์ฉํ ์ ์์)
Promise๊ฐ ๋ค์ด์๋ array๋ฅผ ์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ด์ค ์ ์์
๋น๋๊ธฐ๋ async/await๋ก ์ ์ดํ ์ ์๋๋ฐ ์ ํ์ดํ๋ผ์ธ์ด ํ์ํ์ง?
async/await : ์๋ ํํ์์ผ๋ก ๊ฐํ์๋(ex.then.then...), ํน์ ๋ถ๋ถ์์ **ํจ์ ์ฒด์ธ(ํฉ์ฑ)์ด ์๋๋ผ ๋ฌธ์ฅํ(๋ช ๋ นํ)**์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํ ๋ชฉ์ (ํจ์๋ฅผ ํ์ด๋์ผ๋ ค๋)
ํ์ดํ๋ผ์ธ(์ดํฐ๋ฌ๋ธ์ค์ฌ) : ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ง ์๊ณ ๋ ์์ ํ๊ฒ ํจ์ ํฉ์ฑ์ ํ๊ธฐ์ํ ๋ชฉ์ (๋๊ธฐ/๋น๋๊ธฐ ์ํฉ๊ณผ๋ ์ฐ๊ดX)
async/await์ ํ์ดํ๋ผ์ธ์ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ๋ ํ๋์ง?
async function f5(list) {
const r1 = await go(list,
L.map(a => delayI(a * a)),
L.filter(a => delayI(a % 2)),
L.map(a => delayI(a + 1)),
C.take(2),
reduce((a, b) => delayI(a + b)));
const r2 = await go(list,
L.map(a => delayI(a * a)),
L.filter(a => delayI(a % 2)),
reduce((a, b) => delayI(a + b)));
const r3 = await delay(r1 + r2);
return r3 + 10;
}
go(f5([1, 2, 3, 4, 5, 6, 7, 8]), a => log(a));
Last updated