Redux Thunk 와 Redux Saga 둘다 비동기함수를 처리할수 있게 해주는 도구이다.
장점
단점
장점
단점
액션과 리듀서에 들어가는 그순간까지 실행시켜주는 함수
const thunkExample = () => {
return async function (dispatch) => {
const items = await fetch("https://www.~~~~~")
if (items) {
dispatch({
type: "ADD",
payload: items.json()
})
}
}
}
thunk가 async하게 API콜도 하고, 그 후에, 최종적으로는 synchronous 한 action을 dispatch해주게 합니다.
{type: "ADD_STATE", payload: items.json()} //-> 요것이 액션!
Saga 는 Thunk 와 마찬가지로 비동기적으로 함수를 처리할수있지만 generators 를 사용하는 차이가 있습니다.
generators의 가장큰 장점은, 중간에 엑스큐션을 멈췄다가, 끝낼 수도 있고, 다시 시작할 수 도 있습니다. 실전에서 이게 왜 필요할까요? (실전에서 이 일들이 발생하는 사례 케이스는 다음에 한 번 만들어 보겠습니다)
function* someGeneratorFunction() {
yield('good')
yield('better')
}
let itr = someGeneratorFunction();
console.log(itr.next()) // {value: "good", done: false}
console.log(itr.next()) // {value: "better", done: false}
console.log(itr.next()) // {value: undefined, done: true}
저희가 saga를 generator를 직접 콜을 해서 .next()를 실행할 일은 없습니다. generator를 설명하고나 직접 실행했을때를 보여주는 용도로 작성된 코드 입니다
import {call, put, takeEvery, all,} from 'redux-saga/effect';
import Api from '...' //<-- 여기는 각자마다 경로가 다르겠죠!
function* fetchUser(action) {
try{
const userData = yield call(Api.fetchUser, action.payload.userId);
yield put({type: 'USER_FETCH_SUCCEEDED', payload: userData.json()});
} catch (e) {
yield put({type: "USER_FETCH_FAILED", message: e.message.});
}
}
function* mySaga() {
yield takeEvery("USER_FETCH_REQUESTED", fetchUser);
}
export default function* rootSaga() {
yield all([
mySaga(),
//다른 사가도 여기에 추가 하기!
])
}