zeroCho react-NodeBird 3강
```javascript
const dispatch = useDispatch(); const selectedReducer = useSelector(state => state.reducer)
(중간의 멈춤)
function* generator () {
console.log(a)
yield;// 중단점, {value : null, done : false}
console.log(b)
yield 5; // 중단점, {value : 5, done : ture}
console.log(c)
yield* `12345` // 1->중단->2->중단->3->중단->4->중단->5
yield take(action)
// 해당 액션이 dispatch되면 제너레이터를 next하는 이펙트
yield delay(2000);
yield put(action0)
// put은 redux의 dispatch와 같은 의미
// 바로 윗줄 코드와 합쳐서 보면 action을 받으면 2초후에 action0을 자동으로 실행한다는 의미
yield all([action1, action2, action3])
// action 1, 2, 3중 하나가 dispatch되면 next하는 이펙트
}
const gen = generator();
gen.next() // 제너리이터 함수 실행 -> yield에서 중단
// 제너레이터 함수가 끝나서 클로즈드가 되기 전까지는 여러번 실행 가능
(무한의처리)
function* watchHello() {
yield takeEvery(HELLO_SAGA, function*() {
yield delay(1000)
yield put({
type:BYE_SAGA,
})
}
yield takeLatest(HELLO_SAGA, function*(){
// 동시에 여러 액션이 들어오면 마지막 액션만 처리한다.
// 즉 HELLO_SAGA가 6번 동시에 들어오면 마지막 HELLO_SAGA 하나만 처리됨
}
}
// 참고)
function* watchHello2() {
while (true) {
yield take(HELLO_SAGA);
// takeEvery와 같은 결과
}
}
함수실행 이펙트
function* functionEffect() {
yield call(watchHello())
// 동기호출 (서버요청 보내고 응답 받을 때까지 기다림)
yield fork(watchHello())
// 비동기호출 (서버요청 보내고 성공여부 상관없이 계속 실행)
}
}
기타 이펙트
race, cancel, select, throttle 등...
리덕스 사가 코딩 패턴
```javascript
function* loginAPI() {
// 서버에 요청을 보내는 부분
}
function* login() {
try {
yield call(loginAPI);
yield put({
type: LOG_IN_SUCCESS
});
} catch (e) {
console.error(e);
yield put({
type: LOG_IN_FAILURE
});
}
}
// 3. 실제로 어떻게 동작할지 구현
function* watchLogin() {
yield takeLatest(LOG_IN_REQUEST, login);
}
// 2. takeEvery인지 takeLatest인지 결정
export default function* userSaga() {
yield all([fork(watchLogin)]);
}
// 1. 실행할 함수 선언
```
실제로 실행할 함수 선언 -> takeEvery인지 takeLatest인지 결정 -> 실제로 어떻게 동작할지 구현
asdfasdgxcvcc