【问题标题】:How to run redux-saga middleware on the any dispatch action?如何在任何调度操作上运行 redux-saga 中间件?
【发布时间】:2019-12-16 08:59:42
【问题描述】:

我在 'usersaga.js' 中定义了以下 redux saga 中间件函数

import {call, put, takeEvery, takeLatest} from "redux-saga/effects";
import {REQUEST_API_DATA, receiveApiData} from '../store/actions';

import userServiceObject from '../services/user.service';


// Worker Saga function will be fired on USER_FETCH_ACTIONS

export function* getApiData(action){
    console.log(action)
    try{
        // Do Api Call
        const data = yield call(userServiceObject.getUsers);
        console.log(data.data);
        yield put(receiveApiData(data.data));
    }
    catch(error){
        console.log("this is error part and executing");
        console.log(error);
    }
}

在 'index.js' 文件中,我使用“run”方法运行上面的函数 getApiData

import React from 'react';
import ReactDOM from 'react-dom';
import {createStore, combineReducers, applyMiddleware } from 'redux';
import {Provider} from 'react-redux';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

import contactReducer from './store/reducers/userlist';

// For Creating Saga and connecting store to saga middleware
import createSagaMiddleware from 'redux-saga';
import {getApiData} from './sagas/usersaga';

const sagaMiddleware = createSagaMiddleware();

const rootReducer = combineReducers({
    res: contactReducer
})

const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));

sagaMiddleware.run(getApiData);

ReactDOM.render(<Provider store={store}> <App /> </Provider>, document.getElementById('root'));



serviceWorker.unregister();

它成功地从 api 获取数据,并且我成功地处理了由“receiveApiData”动作生成器函数生成的动作中的数据。
我想在由函数“requestApiData”生成的操作上调用 getApiData 函数,该函数由其调度。操作名称是“{type: REQUEST_API_DATA}”
如何在已调度的操作上运行我们的 getApiData。 我的 userlist reducer 文件如下所示

import * as actionTypes from "../actions";

const initialState = {
    value: '',
    results: []
};

const reducer = (state = initialState, action) => {
    switch(action.type){
        case actionTypes.STORE_CONTACTS:   // This is for storing all contacts in the state here
            console.log(action.values)
            return {
                ...state,
                results: action.values
            }

        case actionTypes.RECEIVE_API_DATA:  
            console.log(action);
            return{
                ...state,
                results: action.contacts
            }
        case actionTypes.DELETE_CONTACT:
            return {
                ...state,
                results: action.value
            }
        case actionTypes.ADD_CONTACT:
            // perform add action to the database, update state and return All new data
            return {
                ...state,

            }
        case actionTypes.EDIT_CONTACT:
            return {
                ...state,
            }
        default:
            return state;

    }
};

export default reducer;

【问题讨论】:

    标签: javascript reactjs redux react-redux redux-saga


    【解决方案1】:

    您需要使用您实际上已经在 usersaga.js 中导入的 takeEvery 效果

    所以在 usersaga.js 中添加这个传奇:

    export function* requestWatcher(action){
        yield takeEvery('REQUEST_API_DATA', getApiData);
    }
    

    并且在 index.js 中运行这个 saga 而不是直接运行 getApiData:

    sagaMiddleware.run(requestWatcher);
    

    这是 redux-saga 的基本概念之一,我真的建议阅读文档https://redux-saga.js.org/docs/basics/UsingSagaHelpers.html

    【讨论】:

    • 非常感谢,它可以工作,但是如果我需要在操作 'DELETE_API_DATA' 上执行另一个函数 'deleteApiData' 。我可以在 usersaga.js 中声明函数 deleteApiData 并在 requestWatcher 中添加另一行,例如yield takeEvery('DELETE_API_DATA', deleteApiData);
    • 当然,takeEvery 是非阻塞的,因此您只需将多个它们一个接一个放置即可。
    猜你喜欢
    • 2018-06-19
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    相关资源
    最近更新 更多