Redux Saga: сочинять саги - PullRequest
       4

Redux Saga: сочинять саги

0 голосов
/ 30 марта 2020

У меня есть networkSaga, где я получаю сообщения, добавляю и удаляю лайки. После того, как я добавил или удалил лайк, мне нужно позвонить getPosts, чтобы обновить количество лайков.

В redux-thunk я просто позвоню dispatch(getPosts()) после того, как я добавил или удалил лайк. Так как я новичок в сагах, я обеспокоен, как это должно быть сделано?

import { all, call, fork, put, takeEvery } from 'redux-saga/effects';
import { NetworkActionTypes } from './types';
import { apiCaller } from '../../utils/apiCaller';
import { onSuccess, onFailure } from '../../utils/actionCreators';

function* getPosts(action): Generator {
  try {
    const res = yield call(apiCaller, action.meta.method, action.meta.route, action.meta.data);

    yield put(onSuccess(NetworkActionTypes.GET_POSTS_SUCCESS, res));
  } catch (err) {
    yield put(onFailure(NetworkActionTypes.GET_POSTS_ERROR, err));
  }
}

function* addLike(action): Generator {
  try {
    const res = yield call(apiCaller, action.meta.method, action.meta.route, action.meta.data);

    yield put(onSuccess(NetworkActionTypes.ADD_LIKE_SUCCESS, res));
  } catch (err) {
    yield put(onFailure(NetworkActionTypes.ADD_LIKE_ERROR, err));
  }
}

function* removeLike(action): Generator {
  try {
    const res = yield call(apiCaller, action.meta.method, action.meta.route, action.meta.data);

    yield put(onSuccess(NetworkActionTypes.REMOVE_LIKE_SUCCESS, res));
  } catch (err) {
    yield put(onFailure(NetworkActionTypes.REMOVE_LIKE_ERROR, err));
  }
}

/**
 * @desc Watches every specified action and runs effect method and passes action args to it
 */
function* watchFetchRequest(): Generator {
  yield takeEvery(NetworkActionTypes.GET_POSTS, getPosts);
  yield takeEvery(NetworkActionTypes.ADD_LIKE, addLike);
  yield takeEvery(NetworkActionTypes.REMOVE_LIKE, removeLike);
}

/**
 * @desc saga init, forks in effects, other sagas
 */
export function* networkSaga() {
  yield all([fork(watchFetchRequest)]);
}

Вопрос может звучать глупо sh, но я буду благодарен, если вы укажете мне на решение. Спасибо!

1 Ответ

0 голосов
/ 30 марта 2020

вы можете сделать yield getPosts(action json you have to pass here), как только вы получите успех от add/remove API.

Но я предлагаю лучше запустить действие из компонента, который сделает это за вас, Это поможет вам сохранить все функции генератора для повторного использования и тестирования.

...