강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

Einere님의 프로필 이미지
Einere

작성한 질문수

함수형 프로그래밍과 JavaScript ES6+

reduce에서 nop 지원

async/await를 이용할 수는 없나요?

작성

·

247

1

L.reduce를 async함수로 리팩토링하려고 하고 있습니다.

다음은 제가 구현한 코드입니다.

L.filter = L.curry(function* (f, iterable) {
    // for (const e of iterable) if (f(e)) yield e;
    for (const e of iterable) {
        const result = L.branch(e, f);
        if (result instanceof Promise) yield result.then((val) => val ? e : Promise.reject(L.nop));
        else if (result) yield e;
    }
});

L.reduce = L.curry(async (f, acc, iter) => {
    if (!iter) {
        iter = acc[Symbol.iterator]();
        acc = await iter.next().value;
    }

    for (const e of iter) {
        try {
            acc = await f(acc, await e);
        } catch (err) {
            if (err === L.nop) acc = await f(acc, e);
            if (err !== L.nop) return Promise.reject(err);
        }
    }

    return acc;
}) 

위 코드를 이용해 영상의 예제를 다음과 같이 실행하면 결과가 다음과 같이 나옵니다.

const L = require("./myUtils.js");

L.go(
    [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3), Promise.resolve(4), Promise.resolve(5), Promise.resolve(6)],
    L.filter(val => !(val % 2)),
    L.reduce((acc, val) => acc + val),
    console.log
).catch(console.log);

// 출력 : 2[object Promise]4[object Promise]6

  어떻게 수정하면 좋을까요..?

 

 

답변 1

3

MDU 유인동님의 프로필 이미지
MDU 유인동
지식공유자

if (err === L.nop) acc = await f(acc, e);

우선 이 부분이 잘못되었어요.

그리고 위 코드를 작성함에 있어 async await 를 사용하게 되면 Promise가 생기지 않는 상황에서도 항상 비동기로 랩핑되기 때문에 동기만 있는 상황에서는 꽤 느려지는 문제가 있어요.

무조건 비동기 방식으로 동작하는 함수를 작성하는데 있어서는 문제가 없구요.

async await 를 사용하지 말라는 이야기가 아니니 오해하시지 말길 바래요.

본 강의에서의 함수는 두 상황에서 다 적절하게 동작하는 함수를 만드는데 목적을 가지고 있어요.

그리고 앞으로 앱을 만드는 코드에서 async await를 잘 사용할 수 있게 하기 위한 목적도 가지고 있구요.

감사합니다.

Einere님의 프로필 이미지
Einere

작성한 질문수

질문하기