Redux-Saga не запускается - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь внедрить redux-сагу в приложение реакции, уже использующее redux.Моя первая цель - ввести сагу, когда пользователь пытается войти в систему.

Форма входа отправит «USER_LOGIN_REQUEST», а сага отвечает за вызов бэкэнда, а затем отправку «USERS_LOGIN_SUCCESS» после завершения.,Я вижу, что 'USER_LOGIN_REQUEST' является редуктом devtool, но не 'USERS_LOGIN_SUCCESS'.

Я не вижу ошибок в журнале консоли, и отладчик не прерывается в саге.Есть идеи, почему это не работает?

store.js

import { combineReducers, createStore, applyMiddleware } from 'redux'
import * as Reducers from './reducers'
import { composeWithDevTools } from 'redux-devtools-extension';
import createSagaMiddleware from 'redux-saga'
import rootSaga from './sagas'

const rootReducer = combineReducers({
    login: Reducers.loginReducer
})

const sagaMiddleware = createSagaMiddleware();

export default createStore(
  rootReducer,
  composeWithDevTools(
    applyMiddleware(sagaMiddleware)
  )
)

sagaMiddleware.run(rootSaga);

rootSaga.js

import { all, call, delay, spawn } from 'redux-saga/effects'
import { userLoginRequestSaga } from "./loginSaga";

const makeRestartable = (saga) => {
    return function* () {
      yield spawn(function* () {
        while (true) {
          try {
            yield call(saga);
            console.error("unexpected root saga termination. The root sagas are supposed to be sagas that live during the whole app lifetime!",saga);
          } catch (e) {
            console.error("Saga error, the saga will be restarted",e);
          }
          yield delay(1000); // Avoid infinite failures blocking app TODO use backoff retry policy...
        }
      })
    };
};

const sagas = [
    userLoginRequestSaga
].map(makeRestartable);

export default function* rootSaga() {
    yield sagas.map(saga => call(saga));
}

loginSaga.js

import { call, delay, spawn, put, takeEvery } from 'redux-saga/effects'

export function* getLoginDetails() {
  //yield delay(100)
  yield put({ type: 'USERS_LOGIN_SUCCESS' })
}

export function* userLoginRequestSaga() {
  yield takeEvery('USER_LOGIN_REQUEST', getLoginDetails)
}

package.json

{
  "name": "MyApp",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.8.5",
    "react-dom": "^16.8.5",
    "react-redux": "^6.0.1",
    "react-router-dom": "^5.0.0",
    "react-scripts": "2.1.8",
    "redux": "^4.0.1",
    "redux-actions": "^2.6.5",
    "redux-devtools-extension": "^2.13.8",
    "redux-saga": "^1.0.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": [
    ">0.2%",
    "not dead",
    "not ie <= 11",
    "not op_mini all"
  ]
}

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 23 апреля 2019

Я думаю, что выполнение массива эффектов устарело в v1 версии redux-saga.

Попробуйте заменить yield sagas.map(saga => call(saga));

на yield all(sagas.map(saga => call(saga)));

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