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

mhr님의 프로필 이미지
mhr

작성한 질문수

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

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

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

작성

·

318

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
  );

답변 4

2

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

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

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

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

감사합니다 :)

1

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

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

네 맞습니다. :)

0

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

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

감사합니다.

0

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

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

잘 기억은 않나지만..

return new Promise(function (resolve, reject) {

$.ajax(....) 

})

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

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

mhr님의 프로필 이미지
mhr

작성한 질문수

질문하기