inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

go, pipe, reduce에서 비동기 제어

유명함수 recur를 이용하는 것이 성능상 이점이 있는 이유에 대해서 좀 더 자세한 설명을 듣고 싶습니다.

450

mhr

작성한 질문수 52

0

reduce 함수를 아래와 같이 수정하고 go함수를 실행시킬 경우 acc를 acc = acc instanceof Promise ? acc.then(acc => f(acc, a)):f(acc, a);로 작성한 구현보다  성능상 이점이 있다고 하셨는데 어떤 점에서 그런지 좀 더 자세히 설명해주실 수 있을까요?  특히 콜스택과 관련해서 어떤 차이가 있는지 잘 이해가 안 되네요. Promise에서 then은 매번 새로운 콜스택을 사용하면서 추가적인 로드가 발생하는 것인가요? 재귀함수를 호출하면서 생기는 약간의 추가 로드도 있을 것 같은데, then에서의 콜스택 사용과 비교했을 때에 성능상 이점이 크기 때문에 이렇게 구현해서 사용하는 것인가요? go, pipe, reduce에서 비동기제어편 약 5분 45초 이후에 설명된 부분입니다. 

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

    return (function recur() {
      let cur;
      while (!(cur = iter.next()).done) {
        const a = cur.value;
        acc = f(acc, a);
        if (acc instanceof Promise) {
          return acc.then(recur);
        }
      }
      return acc;
    })(acc);
  });

  go(
    1,
    (a) => a + 10,
    (a) => Promise.resolve(a + 100),
    (a) => a + 1000,
    console.log
  );

javascript 함수형-프로그래밍

답변 4

2

MDU 유인동

for문 만으로 처리하면 모든 함수 마다 promise에 감싸져서 매번 비동기가 일어납니다. 

반면에 후자의 기법을 쓰면 f 가 연속으로 동기인 상황에서는 같은 콜스택에서 반복문안에서 실행되고 비동기가 매번 일어나지 않기 때문에 효율적입니다. 

(매번 recur 가 실행되는 것이 아닌 비동기가 있을때만 실행되고 그때만 promise를 만들게 됩니다.)

감사합니다 :)

1

만금

안녕하세요. 답글과 코드들을 보면서 생각을 해 봤습니다.
유명함수를 사용하기 이전 코드에서는 프로미스 체인이 유지되면서 이벤트 루프가 비동기 큐에 계속해서 머무르면서 성능저하가 일어나기 때문에 유명함수를 사용하여 `비동기 처리가 필요한 시점`에서만 비동기 처리를 하는 것으로 이해를 했는데 설명하신 의도와 맞는 방향일까요??

0

MDU 유인동

네 맞습니다. :)

0

MDU 유인동

아래 코드를 결과를 확인해봐주세요 :)

감사합니다.

0

ki mu

저도 이 부분에 대해서 질문이 있는데요...

Promise 에 감싸져서 매번 비동기가 일어난다고 하셨잖아요. 그런데 Promise는 단지 비동기상황을 컨트롤 하기위한 객체아닌가요?? 비동기적인 상황은 Promise(({.... 비동기 상황}) 이렇게 Promise 안에있는 코드가 비동기적인 상황을 만드는거 아닌가요??

잘 기억은 않나지만..

return new Promise(function (resolve, reject) {

$.ajax(....) 

})

이런 방식으로 사용되는 코드를 봐서요..

답변 해주시면 감사하겠습니다.

프론트엔드 실무에서 어떤때에 쓰이는지 궁금합니다

1

111

1

함수형 프로그래밍 심화 강의 자료 추천

0

72

2

함수형 자바스크립트 프로그래밍 책

0

52

1

filter가 아무것도 걸러내지 못하는 경우

0

112

1

take 함수의 성능적면에서의 이점

1

463

1

pipe함수

1

530

1

Identity 함수

0

450

1

함수형 프로그래밍이란

0

831

1

reduce 예제 코드 제안!

0

403

1

fxts를 배워보려고 합니다.

1

537

1

flatMap 관련 질문드립니다~

1

444

1

다용성이 높은 L.flatMap

0

357

1

변수에 재 할당 금지~

0

540

1

DevTools라고 옆에 결과 확인하는거 어떻게 하나요?

0

482

2

소요시간에 관해서 질문드립니다

1

457

1

join에 대한 내용이 궁금증이 해결되지 않아서 질문드립니다!

0

465

2

reduce에 L.range를 사용할 때

0

526

2

[이해내용 공유] Lazy 에서 C.reduce가 병렬 효과를 내는 이유

3

738

2

제가 이해한 C.Reduce와 Reduce의 동작 차이 정리

2

787

3

go, pipe 함수 관련하여 질문 드립니다.

1

498

1

안녕하세요 강사님!

0

378

2

fxts에 go가 없는 이유?

0

838

1

비동기 관련 질문입니다!

0

458

1

질문 있습니다.

0

514

1