작성
·
531
·
수정됨
2
_.reduce 와 C.reduce의 차이는
[...iter]로 제너레이터를 한번에 돌려 프로미스들을 동시에 평가 ( 프로미스의 평가 == 프로미스 객체 반환, 콜백함수 즉시실행 ) 하는데에 있다.
만약 [... ]형태로 전개하지 않는다면 reduce의 while문에서 next()를 하여 yield 로 반환하는 값을 하나씩 빼 올 것이고,
이 과정에서 프로미스는 뽑힌다면 (=평가된다면) 뽑히는 과정에서 비로소 콜백을 실행 할 것이다. 그러나 전개하지 않은 상태에서는 이런 뽑히는 과정이 순차적이므로,
'프로미스를 뽑아서 콜백을 실행 시켜준 후, reduce 자체를 return 하여 콜백이 완료될 때 까지 기다리고 다시 recur 재귀함수를 통해 이어서 진행하는 과정'
을 프로미스가 뽑힐 때마다 해주어야 하는 것이다.
반면에 [...] 형태로 전개하여 사용하면, yield로 반환될 모든 값이 배열에 담긴다. 이 과정에서 뽑힌 프로미스는 콜백이 바로 실행될 것이고, 만약 제너레이터에 여러 프로미스들이 존재한다면 제너레이터의 next()가 연속적으로 동작함에 따라 콜백도 주르륵 병렬되게 실행 될 것이다.
이런 프로미스를 포함한 배열을 받은 reduce는 then()을 통해서 reduce를 종료하고 프로미스를 반환한다. 콜백이 완료되면 then(recur)에 의해 재 실행된다. 여러 프로미스들이 거의 동시에 자신의 콜백을 실행시켰기 때문에, reduce 입장에서는 전체 시간이 가장 오래걸리는 놈 만큼만 소요다는 것이다. 마치 Promise.all() 이 동작하는것 처럼 말이다
답변 3
1
1
안녕하세요, 인프런 AI 인턴이에요.
제가 이해하기로는, yus님은 C.Reduce와 Reduce함수의 동작 방식에 대해 설명하셨군요. 이는 Concurrency Reduce와 Strict Reduce의 동작 방식 차이를 설명하면서 이루어졌습니다.
C.Reduce는 배열을 전개하여 제너레이터를 한 번에 돌려 프로미스들을 동시에 평가하는 방식으로, 비효율적인 대기 시간을 최소화하는 것이 특징입니다. 이때 프로미스가 평가되어 콜백이 실행됩니다.
반면 _.reduce는 전개하지 않은 배열에서 while문을 이용해 yield로 값을 하나씩 빼오는 과정에서, 평가된 프로미스가 뽑히면 해당 콜백이 실행됩니다. 이때 reduce 자체를 반환하여 콜백이 완료될 때까지 대기하는 과정을 거칩니다.
yus님은 C.Reduce의 경우 yield로 반환될 모든 값이 배열에 담긴다는 점과, 여러 프로미스들이 거의 동시에 자신의 콜백을 실행시켰기 때문에 전체 시간이 가장 오래걸리는 놈 만큼만 소요된다는 것을 강조하셨습니다.
정확한 내용 전달에 도움이 되었기를 바랍니다. 감사합니다.
0
와우 두 분다 엄청나요! 감사합니다!