Redux Saga
- Redux의 비동기처리를 위한 미들웨어
generator
함수 기반으로 비동기작업을 관리
- redux-saga의
saga
가 generator
함수를 의미한다.
- generator 함수에서 action에 따른 작업을
yield
Thunk와의 차이점
Thunk
는 비동기액션함수를 직접 호출하는 형식이지만 Saga
는 제너레이터 함수를 등록하여 이벤트 핸들러와 같은 느낌으로 지정한 액션이 호출될때 낚아챈다.
장점
generator
함수를 이용하기 때문에 테스트하기 용이하다.
next()
를 이용하면 yield
로 구분되어진 영역이 나눠서 실행되기 때문
단점
Generator란?
구성
import createSagaMiddleware from 'redux-saga';
import rootSaga from '../sagas'
const configureStore = () => {
const sagaMiddleware = createSagaMiddleware();
const middlewares = [sagaMiddleware];
const store = createStore(reducer);
store.sagaTask = sagaMiddleware.run(rootSaga);
return store;
};
saga effects
- react saga가 제공하는 다양한 기능들
- effects 앞에
yield
를 붙여서 실행
all
- 배열을 인자로 받고 배열안에 들어있는 것들을 한번에 실행
yield all([
fork(watchLogin),
fork(watchLogOut),
]);
call
- 다른 saga들이나 promise 등을 호출(실행)
- 인자로 넘긴 콜백함수의 결과값을 받아올때까지 기다렸다가 진행(동기식)
call
에 첫번째 인자로 등록한 함수에 데이터를 전달하려면 등록한 함수에 데이터를 바로 전달하는것이 아닌 call
의 다음 인자로 전달해야 한다. (fork
도 동일)
yield call(api, data, data2, data3)
fork
- 인자로 넘긴 콜백함수의 결과값을 받아올때까지 기다리지 않고 진행(비동기식)
fork(watchLogin, data)
put
take
- 액션이 디스패치되기를 기다린다.
- 액션이 실행되면 두번째 인자로 전달한 제너레이터 함수를 실행
- 일회성이므로 한번 실행되고 더이상 실행이 안됨
yield take(action, gen);
takeEvery
takeLatest
- 같은 액션이 동시에 여러번 호출되면 마지막 액션 하나만 유효하게 인정
- 마지막 액션 하나만 유효하다고 해서 나머지 요청을 서버로 보내는 것을 막는것은 아니다.
- 서버로 요청은 보내지만 클라이언트에서 나머지 응답을 취소하고 마지막 응답만 허용하는 것
- 즉, 요청을 취소할수 없으므로 서버에 데이터 변경은 여러번 일어난다.(서버측에서 반드시 같은 데이터 변경이 일어날때의 검사작업 필요)
takeLeading
- 같은 액션이 동시에 여러번 호출되면 첫번째 액션 하나만 유효하게 인정
throttle
- 같은 액션이 연이어 호출 되면 설정한 시간이 지나기 전에 다시 호출되지 않도록 하는 것
- 서버로 요청을 보내는것을 막을 수 있음
- 특수한 경우에서만 활용됨
yiled throttle(action, gen, sec);
debounce
- 같은 액션이 연이어 호출되면 마지막 함수(또는 제일 처음)만 호출되도록 하는 것
select
- 셀렉터를 사용하여 기존 애플리케이션 상태의 일부를 얻어온다.
cancel
cancelled
delay
- 다음 구문으로 이동하기 전에 주어진 기간동안 대기
- promise를 반환한다.