saga의 아이디어는 generater 함수인데 ..
* 별을찍는것이다 이렇게 function* 충격과 공포임
function* idMaker(){
var index = 0;
while(true)
yield index++;
}
보통 함수라면 while(true)시 무한 반복이 되겠지만 generater 함수에서 yield를쓴다면
함수를 호출할떄마다 한번 하고 멈추고 한번하고 멈추게된다.
var gen = idMaker(); // "Generator { }"
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
실제 콘솔로그를 찍는다면 0 멈추고 다시 호출하면 1 멈추고 다시호출하면2 .이런식
약간비유를하자면 event listener같다.
즉,
yield 를 넣어주면 멈춤 중단점이 생김
함수를 중간에 멈추고싶다 == generater 함수를 쓰면 가능!
그것을 이용한게 saga (유사 무한이벤트리스너)
login에대해 구현해보면..
import { all, fork, take, call, put } from "redux-saga/effects";
import axios from "axios";
// 서버에 값을 요청
function logInAPI(data) {
return axios.post("/api/login", data);
}
function* logIn(action) {
try {
// 로그인성공 정보를 담음
const result = yield call(logInAPI, action.data);
yield put({
type: "LOG_IN_SUCCESS",
data: result.data,
});
} catch (err) {
// 로그인실패 정보
yield put({
type: "LOG_IN_FAILURE",
data: err.response.data,
});
}
}
function* watchLogin() {
yield take("LOG_IN_REQUEST", logIn);
}
// 루트 사가를 만들고 비동기 액션들을 넣어준다.
export default function* rootSaga() {
yield all([fork(watchLogin)]);
}
여기서 주의할건 api호출함수는 generater 함수가 아니다
saga에 단점은 action 함수들이 많아지면 코드가 길어진다는것이다.
saga effect
all : 배열을 받고 , 배열안에것들을 한번에 실행해준다(동시에실행)
fork : 비동기 함수 호출, 실행
call : 동기 함수 호출 ,실행
take : 기다리겠다 LOG_IN 이라는 액션이 실행될떄까지 기다림
put : dispatch
'JavaScript > Redux' 카테고리의 다른 글
[Redux-toolkit] Redux-toolkit 이란? (0) | 2021.04.18 |
---|---|
[Redux] redux-thunk / redux-saga (1) | 2020.11.26 |