작성
·
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>
위와 같이 순환참조 오류가 발생하는데 이렇게 발생하는 이유가 아래와 같은 순서로 인해 발생하는게 맞는지 확인좀 부탁드립니다...
acc에 a.then메서드가 호출된 결과로 이때 pending 상태의 Promise 객체가 할당됨
a.then메서드의 콜백함수가 실행되며 1번의 pending상태의 Promise객체가 리턴
pending상태이기 때문에 settled상태가 아니며 프로미스 체이닝이 불가능 하고 프로미스를 사용 할 수 없는 무한정 대기상태에 빠짐
프로미스 다루는게 무진장 어렵다는것을 한 강의 한 강의 마다 느낍니다...
아 제가 추상적으로 함수라고 질문 했네요...
강의에서 나온 코드에서 reduceF함수로 분리하지 않고
reduce 함수에서 처리 했을 경우 발생하는 오류에 대해서 여쭤봤습니다...!