작성
·
399
·
수정됨
0
안녕하세요 11:45초 경의 payment를 평가하는 과정에서 발행하는 과정을 제가 이해한대로 정리해 보았는데 틀린 부분이 있는지 궁금합니다.
go() 를 통해 함수들을 연달아 수행하게 한다.
그 내부에는 L.range, L.map, L.takeUntil, _.flat이 들어가 있다.
L.range, L.map, L.takeUntil은 모두 Lazy 함수이므로, 제너레이터를 생성한다. 즉, next()로 값을 요구하기 전까지는 리턴하는 값이 없다.
_.flat()은 Lazy 함수가 아닌 일반 함수이다. 따라서 리턴값을 내 놓기 위해 리턴에 해당하는 배열을 모두 채워야 한다.
flat이 값을 채우기 위해 takeUntil에 next()를 요청한다.
takeUntil은 flat에서 주기 위한 값을 만들기 위해 map 에 next()를 요청함.
map도 마찬가지로 range에 next 요청
range는 next()를 통해 1을 반환한다.
map은 받은 1을 가지고 Impt.getPayments를 실행시키고, 반환되는 promise를 takeUntil에 넘김
takeUntil은 받은 프로미스를 해결되면 조건식에 넣어서 판단할 것이라는 새로운 프로미스를 생성하여 리턴값으로 반환함.
flat은 takeUntil로 부터 받은 프로미스가 해결되면 그 값을 자신의 결과 배열에 넣을 것이라는 프로미스를 생성하여 반환함.
(* 이때 console.log를 찍게되면, 여기서 반환되는 프로미스가 출력되는 것 )
잠시후에 프로미스 체인에 연결된 모든 프로미스가 resolve 되고, resolve 된 값은 flat의 결과 배열에 넣어짐. 끝나지 않은 상태이므로 flat은 takeUntil에 또 값을 요청함 ( flat 에서 해결된 프로미스는 (끝나지 않았을 경우) 다시 프로미스를 반환함. 즉, flat이 어떤 조건을 만족해서 더 받아오는 것이 끝나야 비로소 promise가 완전히 resolve 되고, 비로소 res를 리턴할 수 있음 - (* flat~takeAll~take 이므로 FxJS/Strict/take.js 코드 참조 )
6~12 번의 반복
flat이 takeUntil에 값을 요청했는데, takeUntil이 조건문을 만족하지 못하는 값을 받은적이 있어 false로 마감되었음. 따라서 next()를 해도 반환되지 못하고, 상태는 done임.
flat은 더이상 받을 값이 없으므로, 최종 프로미스가 resolve 되고 그 동안 받아서 정리해온 배열을 리턴값으로 반환함
답변 1
0
안녕하세요, 인프런 AI 인턴이에요.
yus님의 글을 읽어보니, 제너레이터 함수와 비동기 함수의 혼합된 상황에서의 평가과정에 대한 이해를 공부하고 계신 것 같아요.
제너레이터 함수와 비동기 함수를 혼합하여 사용하는 경우, 각 함수의 특징에 따라 리턴값을 반환하는 원리가 다르기 때문에 복잡한 로직이 도입될 수 있습니다.
yus님의 설명에서 이해하기 어려운 부분은 없어보입니다. 하지만 제가 파악하기에도 부정확하거나, 불완전한 부분은 없는 것 같아요.
추가적으로 궁금하신 내용이 있으시다면 다시 질문해주세요. 감사합니다.