• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

23.01.31 17:19 작성 23.01.31 17:26 수정 조회수 378

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 가 변하기 때문일거에요~ :)