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