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

shut up and squat님의 프로필 이미지
shut up and squat

작성한 질문수

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

reduce에서 nop 지원

함수를 분리하지 않고 실행하게 되면 순환참조 오류가 발생합니다...

작성

·

543

·

수정됨

0

const reduce = curry((f, acc, iter) => {
  if (!iter) return reduce(f, head((iter = acc[Symbol.iterator]())), iter);

  iter = iter[Symbol.iterator]();
  return go1(acc, function recur(acc) {
    let cur;
    while (!(cur = iter.next()).done) {
      /* acc = reduceF(acc, cur.value, f); */
      const a = cur.value;
      acc =
        a instanceof Promise
          ? a.then(
              (a) => f(acc, a),
              (e) => (e === nop ? acc : Promise.reject(e))
            )
          : f(acc, a);
      if (acc instanceof Promise) return acc.then(recur);
    }
    return acc;
  });
});

이렇게 실행하면

Uncaught (in promise) TypeError: Chaining cycle detected for promise #<Promise>

위와 같이 순환참조 오류가 발생하는데 이렇게 발생하는 이유가 아래와 같은 순서로 인해 발생하는게 맞는지 확인좀 부탁드립니다...

  1. acc에 a.then메서드가 호출된 결과로 이때 pending 상태의 Promise 객체가 할당됨

     

  2. a.then메서드의 콜백함수가 실행되며 1번의 pending상태의 Promise객체가 리턴

     

  3. pending상태이기 때문에 settled상태가 아니며 프로미스 체이닝이 불가능 하고 프로미스를 사용 할 수 없는 무한정 대기상태에 빠짐

 

프로미스 다루는게 무진장 어렵다는것을 한 강의 한 강의 마다 느낍니다...

답변 1

0

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

코드를 제대로 보지 않았지만 아마도 익명함수가 선언된 상위 스코프에서 상태를 변환시키고 있는 부분이 있기 때문일거에요. 죄송하지만 제 강의에 작성한 코드가 아닌 코드가 왜 동작안하는지 체크해서 정확히 알려드리는 일은 조금 부담스러운거 같아서 충분한 답변이 안되었을 수 있지만 양해부탁드립니다!

 

아 제가 추상적으로 함수라고 질문 했네요...

강의에서 나온 코드에서 reduceF함수로 분리하지 않고

reduce 함수에서 처리 했을 경우 발생하는 오류에 대해서 여쭤봤습니다...!

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

네 아마도 acc 가 변하기 때문일거에요~ :)

shut up and squat님의 프로필 이미지
shut up and squat

작성한 질문수

질문하기