Какова альтернатива Thunk рассылки в саге? - PullRequest
1 голос
/ 13 января 2020

В моем реактивном проекте у меня есть следующий код.

import uuid from 'uuid';
import { SET_ALERT, REMOVE_ALERT } from './types';

export const setAlert = (msg, alertType, timeout = 5000) => dispatch => {
  const id = uuid.v4();
  dispatch({
    type: SET_ALERT,
    payload: { msg, alertType, id }
  });

  setTimeout(() => dispatch({ type: REMOVE_ALERT, payload: id }), timeout);
};

Здесь использовался Thunk. Я применяю сагу в проекте и хочу переписать сагой. Поскольку нет вызовов API, я не хочу отправлять через сагу на редуктор. Я хочу go для редуктора от этого действия напрямую. Так как я могу переписать без отправки?

1 Ответ

3 голосов
/ 13 января 2020

Саги используются для обработки побочных эффектов. Вы можете использовать put для отправки действия прямо из вашей саги.

Вот пример из официальной саги редукс-саги документы

import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
import Api from '...'

// worker Saga: will be fired on USER_FETCH_REQUESTED actions
function* fetchUser(action) {
   try {
      const user = yield call(Api.fetchUser, action.payload.userId);
      yield put({type: "USER_FETCH_SUCCEEDED", user: user});
   } catch (e) {
      yield put({type: "USER_FETCH_FAILED", message: e.message});
   }
}

поэтому если я напишу ваш код, это будет примерно так:

import uuid from 'uuid';
import { SET_ALERT, REMOVE_ALERT } from './types';
import { put } from 'redux-saga/effects'

export const setAlert = (msg, alertType, timeout = 5000) => {
  const id = uuid.v4();
  put({
    type: SET_ALERT,
    payload: { msg, alertType, id }
  });

  setTimeout(() => put({ type: REMOVE_ALERT, payload: id }), timeout);
};

В вашей рабочей саге:

function* someAction(action) {
  try {
     // some logic
     yield setAlert(msg, 5000);
  } catch (e) {
     // some error handling logic
  }
}

Я не проверял это, однако это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...