포크를 사용할 때 redux-flocks를 선택합니다.
아래 두 가지 접근법의 차이점은 무엇입니까?
export function* watchLoginUser() {
yield takeEvery(USER_LOGIN, loginUser)
}
export function* watchLogoutUser() {
yield takeEvery(USER_LOGOUT, logoutUser)
}
export function* watchGetParties() {
yield takeEvery(PARTIES_GET, getParties)
}
export default function* root() {
yield [
fork(watchLoginUser),
fork(watchLogoutUser),
fork(watchGetParties)
]
}
export default function* root() {
yield [
takeEvery(USER_LOGIN, loginUser),
takeEvery(USER_LOGOUT, logoutUser),
takeEvery(PARTIES_GET, getParties)
]
}
포크는 언제, 언제 사용해야 하나요?
일반적으로는fork는, 사가가 비실행 태스크를 개시할 필요가 있는 경우에 편리합니다.여기서 논블로킹이란 발신자가 작업을 시작하고 작업이 완료될 때까지 기다리지 않고 계속 실행하는 것을 의미합니다.
이것이 도움이 될 수 있는 상황은 다양하지만, 주로 다음 두 가지가 있습니다.
- 논리 도메인별 sags 그룹화
- 취소할 수 있도록 태스크에 대한 참조를 유지하는 모습
첫 번째 사용 사례의 예가 될 수 있습니다.다음과 같은 일이 있을 수 있습니다.
yield fork(authSaga);
yield fork(myDomainSpecificSaga);
// you could use here something like yield [];
// but it wouldn't make any difference here
어디에authSaga에는 다음과 같은 것이 포함됩니다.
yield takeEvery(USER_REQUESTED_LOGIN, authenticateUser);
yield takeEvery(USER_REQUESTED_LOGOUT, logoutUser);
이 예는 제안하신 것과 동등하며, 를 사용하여 콜을 발신하고 있는 것을 알 수 있습니다.fork을 낳는 전설takeEvery하지만 실제로는 코드를 정리하기 위해서만 이 작업을 수행할 필요가 있습니다. takeEvery그 자체가 분기된 작업이기 때문에 대부분의 경우 이 작업은 불필요하게 중복됩니다.
두 번째 사용 사례의 예는 다음과 같습니다.
yield take(USER_WAS_AUTHENTICATED);
const task = yield fork(monitorUserProfileUpdates);
yield take(USER_SIGNED_OUT);
yield cancel(task);
이 예에서 볼 수 있듯이monitorUserProfileUpdates발신자의 saga가 재개되는 동안 실행되며, 이 경우,USER_SIGNED_OUT파견되는 액션.또한 필요할 때 취소하기 위해 참조를 유지할 수 있습니다.
완전성을 확보하기 위해 논블로킹콜을 시작하는 다른 방법이 있습니다.spawn.fork그리고.spawn오류와 취소가 자녀마다 어떻게 버블이 되는지에 차이가 있습니다.
보통forkAPI 콜의 디스패치가 여러 개 있는 경우에 도움이 됩니다.그 이유는 태스크로부터의 취소를 인스턴스화함으로써 이러한 취득을 거부할 수 있기 때문입니다.cancel(task1);
최종 사용자가 애플리케이션을 강제로 종료하거나 작업 중 하나가 실패하여 명령, 전략 및 논리에 문제가 생겼을 때 유용하며, 현재 처리 작업을 취소 또는 종료하는 것이 타당할 수 있습니다.
작업을 취소하는 방법은 두 가지가 있습니다.
환원사가 논블로킹 효과 취소 문서에 근거함
import { take, put, call, fork, cancel } from 'redux-saga/effects'
// ...
function* loginFlow() {
while (true) {
const {user, password} = yield take('LOGIN_REQUEST')
// Non-Blocking Effect which is the fork
const task = yield fork(authorize, user, password)
const action = yield take(['LOGOUT', 'LOGIN_ERROR'])
if (action.type === 'LOGOUT'){
//cancel the task
yield cancel(task)
yield call(Api.clearItem, 'token')
}
}
}
또는
import {call, put, fork, delay} from 'redux-saga/effects';
import someAction from 'action/someAction';
function* fetchAll() {
yield fork(fetcher, 'users');
yield fork(fetcher, 'posts');
yield fork(fetcher, 'comments');
yield delay(1500);
}
function* fetcher(endpoint) {
const res = yield call(fetchAPI, endpoint);
if (!res.status) {
throw new Error(`Error: ${res.error}`);
}
yield put(someAction({payload: res.payload}));
}
function* worker() {
try {
yield call(fetchAll);
} catch (err) {
// handle fetchAll errors
}
}
function* watcher() {
yield takeEvery(BLOGS.PUSH, worker);
}
천만에요 :)
언급URL : https://stackoverflow.com/questions/42938520/redux-saga-when-to-use-fork
'programing' 카테고리의 다른 글
| (Angular-ui 지시어를 통해) select2 입력의 폭 설정 (0) | 2023.03.25 |
|---|---|
| WordPress + Disqus + 인라인 스크립트 실행 거부 (0) | 2023.03.25 |
| 반응 - 일부 입력에 대해 "input"의 "value" 프로포트가 null일 수 없습니다. (0) | 2023.03.25 |
| woocommerce를 사용하여 wordpress에서 카트의 항목 수를 가져옵니다. (0) | 2023.03.25 |
| WordPress 블로그를 iOS 앱에 통합하려면 어떻게 해야 합니까? (0) | 2023.03.25 |