작성
·
316
12
병렬 평가를 할 때 이터러블/이터레이터를 전개 연산자로 풀어서 배열 안에 담아 reduce함수에 전달해주던데요, 이렇게 했을 때 무슨 원리로 병렬 평가가 되는 건지 모르겠습니다 ㅠㅠ 배열도 결국 next()로 순회하는 이터레이터의 한 종류 아닌가요...? 저렇게 했을 때 Promise.all을 해주는 효과가 나나요?
답변 4
11
function* f() {
yield console.log(1);
yield console.log(2);
yield console.log(3);
}
const iter = f(); // 아무일도 일어나지 않음
iter.next(); // 콘솔에 1 찍힘
[...iter]; // 콘솔에 2, 3 찍힘
위 예제를 보시면 도움이 되실거 같아요.
결국 [...iter] 를 통해 [Promise, Promise, Promise] 로 모두 출발시키는게 되는 것이죠.
위 예제가 console.log 대신 비동기가 일어나는 함수였다고 치면 f() 를 했을때까지는 아무일도 안일어나는거고 next()를 모두 해놔야 모두 출발한 상태가 될테니까요 :)
8
7
아... 강의에서 저렇게 평가된다고 보여주셨는데 연결지어서 생각을 못했네요 ㅠㅠ
그냥 이터레이터를 전달하면 reduce에서 next로 순회하면서 하나씩 프로미스가 출발되고, 나중에 돌아온 값을 역시 reduce가 합산하는 것이고,
전개 연산자로 평가된 프로미스들을 배열에 담으면 프로미스들은 이미 출발이 된 상태고, reduce는 돌아온 값들을 합산만 해주면 되는 것이죠? 그리고 순차적으로 출발한 것이 아니라 동시에 출발한 것이기에, 모두 돌아올 때까지 걸리는 시간도 훨씬 줄어들고요