인프런 커뮤니티 질문&답변

김창희님의 프로필 이미지
김창희

작성한 질문수

함수형 프로그래밍과 JavaScript ES6+ 응용편

fxjs 라이브러리 takeL 관련하여 질문드립니다.

작성

·

210

0

안녕하세요

기본편 부터 응용편 까지 천천히 학습하고 있습니다.

응용편 부터는 라이브러리를 가져와서 강의를 진행하시는데 강의 수강 중 궁금한 사항이 있어

질문드립니다.

 

github에 올려주신 오픈소스를 참조하는데 takeL 부분이 이해가 되지 않아 문의드립니다.

L.take = curry(function* (l, iter) { let prev = null; iter = iter[Symbol.iterator](); for (const a of iter) { if (a instanceof Promise) { yield (prev = a.then((a) => (--l > -1 ? a : Promise.reject(nop)))); prev = prev.catch(noop); } else { yield (--l, a); } if (!l) break; } });

L.take를 이렇게 표현하면 앞선 Promise가 resolve 되길 기다리는 Promise를 그대로 이어가면서 전달 가능한데
     yield (prev = (prev || Promise.resolve())
        .then((_) => a)
        .then((a) => (--l > -1 ? a : Promise.reject(nop))));
이렇게 표현하신 이유가 어떤이유인지 알고싶습니다.
또 제가 작성한 수정한 부분에 문제가 있다면 알려주시면 감사하겠습니다.

또 궁금한 내용이 오픈소스에 for of 아래 
a.catch(noop); 
Promise를 catch 하는 코드가 추가되어 있는데 이 부분 역시도 어떤의도로 구현한 것인지 궁금합니다.

수업내용에서는 비동기/동시성을 통해 한번에 Promise 콜백이 병렬적으로 평가되면서 배열에 담기는 시점에 콜스택에서 에러가 출력되지 않기 위해 사용하는 트릭으로 알고있는데요,

L.take 에서 a.catch가 실행되는 시점에는 Promise가 reject로 풀려서 전달될 수 없을것 같은데 
이 부분도 설명부탁드립니다.

 

 

답변 2

0

유인동님의 프로필 이미지
유인동
지식공유자

강의 들어주셔서 감사합니다. 동시성을 잘 제어하기 위한 트릭으로 들어간 것으로 기억합니다 😀

작성한지 많이 오래된 코드여서 의도가 모두 기억나지는 않아 자세히 답변 드리지 못했는데 양해부탁드려요.

0

안녕하세요, 인프런 AI 인턴입니다.

김창희님의 질문에 답변 드리겠습니다.

L.take 함수의 코드를 보면 비동기 상황을 처리하기 위해 Promise 객체를 검사하고 처리하는 부분이 있습니다. 여기서 ‘yield’ 키워드를 사용하여 값이나 Promise를 반환합니다.

첫 번째로 예시 코드에서는 Promise.resolve() 부분이 이전 프로미스가 해결될 때까지 기다리도록 하기 위한 방법입니다. 이는 체인에서 이전 프로미스가 성공적으로 해결된 후 현재 프로미스가 실행되게 하여 값을 순차적으로 처리할 수 있게 합니다.

두 번째로, a.catch(noop); 코드는 예외 처리를 위한 것입니다. 여기서 ‘noop’는 아무 작업도 하지 않는 함수를 의미합니다(No Operation). 즉, Promise가 reject 되었을 때 발생하는 에러를 ‘잡아서’(catch) 버리는 역할을 합니다. 이렇게 처리함으로써 비동기 처리 중 예외가 발생해도 연쇄적인 실패를 막고 더욱 안정적으로 함수를 실행할 수 있습니다.

김창희님께서 수정하신 부분에서 문제가 있다면, 이 부분은 질문을 통해 코드를 실행하고 테스트해 볼 수 있는 환경이 아니기 때문에 정확한 답변을 드리기 어렵습니다. 코드가 잘 작동하는지 확인하시려면 구현한 부분을 실행하여 테스트해 봐야 합니다.

해당 라이브러리의 세부 구현 방식이나 사용한 이유에 대해서 더 자세히 알고 싶으시면, 강의를 진행하는 지식공유자에게 직접 질문하거나 github 저장소의 이슈를 통해 질문하시는 것이 좋을 것 같습니다. 강의 결제 전에는 수강 전 문의 게시판을 통하여 질문할 수 있는 방법도 있으니 참고해 주세요.

추가적으로 궁금하신 사항이 있으시다면 인프런 홈페이지의 문의하기 기능을 이용하시거나, 직접 지식공유자에게 연락해 보시기 바랍니다.

항상 학습에 최선을 다하는 모습이 인상적입니다. 개발 학습에 도움이 되길 바라며 궁금한 점이 해결되시길 바랍니다.

김창희님의 프로필 이미지
김창희
질문자

설명부분의

"첫 번째로 예시 코드에서는 Promise.resolve() 부분이 이전 프로미스가 해결될 때까지 기다리도록 하기 위한 방법입니다"

이전 promise가 해결이 완료되었을 때를 기다린다면

a.then((a) => (--l > -1 ? a : Promise.reject(nop)) 이렇게만 표현하더라도 이전 Promise의 결과값을 기다리는것이 아닌가요? 앞선 Promise가 resolve()가 되어야 .a.then()으로 등록한 콜백이 실행되는 것으로 알고 있는데 코드상에 Promise.resolve()를 강제로 실행하고 then()을 통해 for문을 통해 꺼내온 Promise를 전달하는 이유가 궁금합니다.

김창희님의 프로필 이미지
김창희

작성한 질문수

질문하기