기술 블로그
[TIL] 구조분해와 Recoil,그리고 map(),Promise.all 본문
반응형
구조분해 할당 :키워드로 별칭 지정 가능
{data: videos} = something
recoil 사용법
// 기본 세팅 이후
//해당 atom 불러옴 그 후 훅에 넣음
import { videoListState } from '@/atoms/videoListState';
const [videos, setVideos] = useRecoilState(videoListState);//조회 수정
const v = useRecoilValue(videoListState); // 조회
//혹은 selector 훅을 활용해 기존 atom에서 파생된 데이터를 사용할 수 있음
프로미스를 반환하는 여러개의 콜백함수를 다룰땐 Promise.all을 사용한다.
문제
//코파일럿의 추천 코드
const videoLists = await Promise.all(
keywords.map(async (keyword) => {
const { videos: videoList }: { videos: Ivideo[] } =
await youtube.search(keyword);
return videoList;
})
);
Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환합니다. 주어진 프로미스 중 하나가 거부하는 경우, 첫 번째로 거절한 프로미스의 이유를 사용해 자신도 거부합니다. - MDN
map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.
즉 Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행한 후 전체에 대한 프로미스를 반환하는데
map()은 프로미스의 반환이 아닌 호출의 결과를 반환한다.
해결
위와같은 의문점에서 위 코드를 아래와 같이 수정했다.
const videoLists = await Promise.all(
keywords.map((keyword) => youtube.search(keyword))
);
그러니 잘 작동 했다.
알다시피 화살표 함수 축약표현은 리턴을 암시한다.
(param1, param2, …, paramN) => expression
// 다음과 동일함: => { return expression; }
그러므로 youtube.search(keyword) 가 반환한 프로미스들이 배열에 담기게 되고
await Promise.all은 모든 프로미스들이 resolve에 도달하면 결과를 취합하여 반환한다.
결론
- 문제 단락의 첫 코드는 의미없는 Promise.all을 사용한 코드가 된다.
- 코파일럿은 참고만 하자
- 에러 핸들링을 잘하자
반응형
'프론트엔드 > TIL' 카테고리의 다른 글
[TIL] 타입 단언과 타입 가드 (0) | 2023.09.20 |
---|---|
[TIL] map key (0) | 2023.09.18 |
[TIL] ssr 로딩지연과 Exhaustive-deps (0) | 2023.09.17 |
[TIL] npm 의존성과 Sember 버전지정자 (0) | 2023.09.16 |
[TIL] getServerSideProps (0) | 2023.09.14 |
Comments