작성
·
493
4
질문1. 리덕스사가에 액션이 전달되는 과정
dispatch({
type: LOG_IN_REQUEST,
data: { email, password },
});
위와 같이 로그인 버튼을 눌렀을때 인자로 전달된 액션을 dispatch 하게 되는데.
function* watchLogIn() {
yield takeLatest(LOG_IN_REQUEST, logIn);
}
이후 사가에서 LOG_IN REQUEST 에관한 액션이 왔을떄 login 함수가 실행된다는 흐름은 이해를 했습니다. 하지만 액션객체의 type 속성인 LOG_IN_REQUEST 가 어떻게 위에 takeLatest 의 첫번째 인자로 인식이되어 login 함수가 실행되는지 직관적으로 이해가 가지않습니다. 이미 사가 라이브러이에서 정해진 규칙같은 건가요 ? 액션을 디스패치 할때 {type: `액션타입`} 형태여야만 takeLatest('액션타입') 이 인식이되는지 궁금합니다.
질문2. yield
function* logIn(action) {
try {
console.log('saga logIn');
// const result = yield call(logInAPI);
yield delay(1000); => 멈춤?
yield put({ => 멈춤?
type: LOG_IN_SUCCESS,
data: action.data,
});
} catch (err) {
console.error(err);
yield put({
type: LOG_IN_FAILURE,
error: err.response.data,
});
}
}
yield 는 중단점 역활을 한다고 이해했습니다. 그럼 위에 takeLatest 의 두번째인자로 위 login 함수가 실행될때 첫번째 yield delay(1000) 이 실행되고 멈추는게아니라 계속에서 아래 yelid put 쪽을 실행되는부분이 이해가 잘 가지않습니다.!
영상 몇번 돌려보고 찾아도 봤는데 스스로 해결하지 못해 질문 드립니다 ㅜㅠ..
답변 3
6
{type: `액션타입`} 형태여야만 takeLatest('액션타입') 이 인식이되는지 궁금합니다.
네 이게 맞습니다. 둘이 같으면 takeLatest가 반응합니다. 이벤트리스너같은 것과 유사하다고 보시면 됩니다.
saga가 알아서 내부적으로 next를 실행합니다. 그래서 원래 제너레이터를 쓸 때는 yield에서 멈추지만 saga가 next를 계속 순서대로 호출하므로 우리의 눈에는 중단되는 것처럼 보이지 않습니다. next를 호출하면서 Promise는 resolve해서 next를 호출하므로 async/await같은 효과를 낼 수 있습니다.
1
0