programing

포크를 사용할 때 redux-flocks를 선택합니다.

javajsp 2023. 3. 25. 09:53

포크를 사용할 때 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