3-helper-function

action이 dispatch 되었을 때 태스크를 만들기 위해 내부 함수들을 감싸는 헬퍼 이펙트 제공

takeEvery

import { call, put } from "redux-saga/effects";

export function* fetchData(action) {
  try {
    const data = yield call(Api.fetchUser, action.payload.url);
    yield put({ type: "FETCH_SUCCEEDED", data });
  } catch (err) {
    yield put({ type: "FETCH_FAILED", err });
  }
}

위 태스크를 FETCH_REQUESTED 액션마다 실행 하려면

import { takeEvery } from "redux-saga/effects";

function* watchFetchData() {
  yield takeEvery("FETCH_REQUESTED", fetchData);
}

takeEvery

  • 여러 개의 fetchData 인스턴스를 동시에 시작하게 함.

  • 1개 혹은 여러개의 종료되지 않은 fetchData task들이 있으면 새로운 fetchData task를 시작 가능

  • 만약 마지막으로 발생된 리퀘스트의 응답만 얻고 싶으면 takeLatest 헬퍼 사용

import { takeLatest } from "redux-saga/effects";

function* watchFetchData() {
  yield takeLatest("FETCH_REQUESTED", fetchData);
}

takeEvery와 달리 takeLatests는 단 1개의 fetchData만 실행되게 함.

다른 액션들을 보고 있는 여러개의 Saga를 가진다면, Saga를 생성하기 위해 사용된 fork와 비슷한 동작을 하는 내장 함수들과 함께 여러개의 워쳐 들을 만들 수 있음

import { takeEvery } from 'redux-saga'

// FETCH_USERS
function* fetchUsers(action) { ... }

// CREATE_USER
function* createUser(action) { ... }

// use them in parallel
export default function* rootSaga() {
  yield takeEvery('FETCH_USERS', fetchUsers)
  yield takeEvery('CREATE_USER', createUser)
}

Summary

  • 액션이 디스패치되었을 때 태스크를 만들기 위해 내부 함수들을 감싸는 헬퍼 이펙트를 제공

특정 태스크를 특정 액션마다 실행 하게 하려면 takeEvery를 이용

function* watchFetchData() {
  yield takeEvery("FETCH_REQUESTED", fetchData); // 요청할 때마다 fetchData 실행
}

takeEvery는

  • 여러 개의 fetchData 인스턴스 동시에 시작 하게 함.

  • 종료되지 않은 여러개 fetchData task가 있다면 새로운 fetchData task로 시작 가능

takeLatest

  • 마지막으로 발생된 리퀘스트의 응답만 얻고 싶다면 얘 사용

Last updated

Was this helpful?