일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 타입스크립트
- 이더리움
- 이슈
- 클라우드
- 쿠버네티스
- react
- 프론트엔드
- CSS
- 백엔드
- es6
- JavaScript
- 컴퓨터공학
- 파이썬
- k8s
- HTML
- 솔리디티
- 자바스크립트
- AWS
- 백준
- 블록체인
- BFS
- 웹
- 알고리즘
- TypeScript
- 가상화
- 리액트
- kubernetes
- node.js
- next.js
- docker
Archives
- Today
- Total
즐겁게, 코드
redux-saga의 call에 관해 본문
리덕스 사가에는 주식시장을 떠오르게 하는 콜(call)과 풋(put)이 있습니다. (물론 주식과의 연관성은 제로입니다! 😄)
이 중 사가 안에서 콜백을 호출하는 콜에 관한 궁금증이 생겼는데, 바로 코드를 통해 공유드리도록 하겠습니다.
// api/getMemberList.js
export const getMemberList = async () => {
const res = await fetch("http://localhost:5000/member");
const data = await res.json();
return data;
};
// sagas/requestSaga.js
// 예외처리 및 yield all 등의 로직은 생략했습니다.
const loadSuccess = (data) => ({
type: "SUCCESS_FETCH",
loading: false,
payload: data,
});
export function* fetchMemberSaga() {
const result = yield call(getMemberList);
yield put(loadSuccess(result));
}
export function* requestSaga() {
yield takeEvery("REQUEST_FETCH", fetchMemberSaga);
}
사가와 비동기 요청을 통해 DB에서 멤버 정보를 불러오는 기능을 구현한 코드입니다.
동작을 간단히 요약해보자면 "REQUEST_FETCH"
액션이 디스패치되면 콜에 의해 getMemberList
가 호출되고, getMemberList
의 리턴값이 result
변수에 담기게 됩니다.
하지만 getMemberList
함수는 async 함수로 언제나 프라미스를 반환하게 되어 있는데요, 그럼에도 불구하고 result에는 프라미스의 resolve로 주어진 결과값이 담기게 됩니다.
export function* fetchMemberSaga() {
const result = yield call(getMemberList);
console.log(result) // [{memberName: "찬민"...}]
yield put(loadSuccess(result));
}
어떻게 이게 가능한 걸까요?
왜냐 하면 콜은 프라미스가 resolve될 때까지 기다리고, resolve 함수로 넘겨진 값을 yield로 받아오도록 구현되어 있기 때문입니다!
따라서 리덕스 사가를 활용하면 프라미스의 then 내부에서 무언가를 하려 할 필요 없이 페칭 로직에만 집중할 수 있겠습니다. 😄
반응형
'🎨 프론트엔드 > React.js' 카테고리의 다른 글
클라이언트 인증 구현하기 : 인증이란 무엇인가? (0) | 2021.08.21 |
---|---|
리액트의 key 속성은 왜 필요할까? (0) | 2021.08.16 |
useState 똑똑하게 사용하기 (0) | 2021.05.10 |
forwardRef로 함수 컴포넌트의 ref 전달하기 (0) | 2021.04.28 |
useEffect 내에서 async 함수를 사용할 때의 주의점 (2) | 2021.04.27 |
Comments
소소한 팁 : 광고를 눌러주시면, 제가 뮤지컬을 마음껏 보러다닐 수 있어요!
와!! 바로 눌러야겠네요! 😆