안녕하세요.
코드를 작성하면서 실습하는 중입니다. 실습할 때, for of 구문을 이용해서 코드를 작성했는데 이번 take 함수는 의도에 맞게 동작하지 않더라고요. reduce 함수는 for of 구문을 작성해도 잘 작동했는데 이유가 뭘까요?
const go1 = (a, f) => a instanceof Promise ? a.then(f) : f(a);
const reduce = curry((f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
return go1(acc, function recur(acc) {
for (const e of iter) {
acc = f(acc, e);
if (acc instanceof Promise) return acc.then(recur);
}
return acc;
});
});
const take = curry(
(l, iter) => {
let res = [];
return function recur() {
// if(e instanceof Promise) return .then(e => {...}) closure에 담긴 iter 상태가 closed로 변경
// for (const e of iter) {
// if(e instanceof Promise) return .then(e => {...}) 문을 만나도 iter가 closed가 되지 않음
let cur;
while (!(cur = iter.next()).done) {
const e = cur.value;
if (e instanceof Promise) return e.then(e => {
if (res.length == l) return res;
res.push(e);
return recur();
})
if (res.length == l) return res;
res.push(e);
}
return res;
}();
});