return 있고 없고 차이 질문드립니다...!
1062
32 asked
const reduce = curry((f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
} else {
iter = iter[Symbol.iterator]();
}
return (function recur(acc) {
let cur;
while (!(cur = iter.next()).done) {
const a = cur.value;
acc = f(acc, a);
if (acc instanceof Promise) acc.then(recur);
}
return acc;
})(acc);
});
const go = (...args) => reduce((a, f) => f(a), args);
go(
1,
(n) => Promise.resolve(n + 10),
(n) => n + 100,
log
);위와 같이 acc.then을 리턴하지 않는 경우 log에 값이 깨져 보여서 설연휴 동안 계속 왜이런지 고민해서 내린 답인데 글이 길지만 한번 제가 내린답이 맞는지 틀렸다면 어디부분이 잘못됐는지 확인좀 부탁드립니다...! 길어서 댓글로 남기겠습니다.
Answer 3
1
Return이 있는 경우 recur함수 내부 동작 (3번 순서까지 위와 동일 따라서 4번부터 진행)
이후 return을 함으로써 recur 함수가 종료됨 **즉 콜스택이 비워져 있는 상태이며 이터레이터의 값이 모두 소비되지 않은 상태
이벤트 루프에 의해 콜스택이 비워져 있기 때문에 태스크큐에 있는 콜백 함수로 전달된 recur함수가 콜스택으로 옮겨져 실행됨
이때 then메서드로 전달된 콜백 함수의 인자 값은 resolve된 값 11이며 이 값이 recur함수 인자로 전달되며 재귀적으로 실행되면서 남아있는 이터레이터의 값을 소비
이후 while문을 루핑하며 결과값을 차례대로 합성하여 log에 출력
1
* 편의를 위해 (n) => Promise.resolve(n + 10)함수는 a1 (n) => n + 100함수는 a2라고 칭하겠습니다.
Return이 없는 경우 recur함수 내부 동작
acc = f(acc ,a)에 의해 a1 함수의 호출로 Promise의 resolve함수가 호출되어 fulfilled상태(Promise {<fulfilled>: 11})의 프로미스 값이 acc에 담김
acc는 Promise의 인스턴스 이므로 콜백으로 recur함수를 전달하는 acc.then함수 호출
이때 acc.then메서드가 호출 되면서 콜백함수를 태스크큐에 전달
이후 return이 없으므로 동기적으로 while문 루핑
루프에 의해 a2(acc) === a2(Promise {<fulfilled>: 11}) 이기 때문에 a2함수 호출 결과값이 acc에 의도하지 않은 값([object Promise]100)이 담김;
이터레이터의 마지막 요소인 log(acc) 즉 log([object Promise]100) 호출 되어 출력
이후 태스크큐 -> 콜스택 으로 옮겨진 콜백함수가 실행되는 시점에는 상위스코프의 이터레이터의 값이 모두 소비 된 상태이기 때문에 while문을 실행하지 않고 recur함수 종료
프론트엔드 실무에서 어떤때에 쓰이는지 궁금합니다
1
111
1
함수형 프로그래밍 심화 강의 자료 추천
0
72
2
함수형 자바스크립트 프로그래밍 책
0
54
1
filter가 아무것도 걸러내지 못하는 경우
0
114
1
take 함수의 성능적면에서의 이점
1
463
1
pipe함수
1
531
1
Identity 함수
0
450
1
함수형 프로그래밍이란
0
832
1
reduce 예제 코드 제안!
0
405
1
fxts를 배워보려고 합니다.
1
537
1
flatMap 관련 질문드립니다~
1
444
1
다용성이 높은 L.flatMap
0
358
1
변수에 재 할당 금지~
0
540
1
DevTools라고 옆에 결과 확인하는거 어떻게 하나요?
0
483
2
소요시간에 관해서 질문드립니다
1
458
1
join에 대한 내용이 궁금증이 해결되지 않아서 질문드립니다!
0
465
2
reduce에 L.range를 사용할 때
0
527
2
[이해내용 공유] Lazy 에서 C.reduce가 병렬 효과를 내는 이유
3
739
2
제가 이해한 C.Reduce와 Reduce의 동작 차이 정리
2
787
3
go, pipe 함수 관련하여 질문 드립니다.
1
499
1
안녕하세요 강사님!
0
380
2
fxts에 go가 없는 이유?
0
840
1
비동기 관련 질문입니다!
0
462
1
질문 있습니다.
0
517
1

