与redux reducer结合的axios响应拦截器

Posted

技术标签:

【中文标题】与redux reducer结合的axios响应拦截器【英文标题】:Axios response interceptor with combination with redux reducer 【发布时间】:2017-05-28 20:49:46 【问题描述】:
   import React from "react";
    import axios from "axios";
    import push from "react-router-redux";
    import actionTypes from "../Patient/actions";
    import put, call from "redux-saga/effects";
    import updatePermissionsAction from "../Patient/actions"

    // Add a response interceptor for getting permissions
    axios.interceptors.response.use(function(response) 

        console.log("in interceptorXXXXXXXXXXX");
        if(response.headers.permissions == null) 
            return response;
        
        var permissions = response.headers.permissions.split(',');

        permissions.forEach((permission, index, permissionArray) => 
            permissionArray[index] = permission.trim();
        );


        put(
             type: actionTypes.UPDATE_PERMISSIONS,
             permissions: permissions
         );
        return response;
    , function (error) 
        // Do something with response error

    );

正在调用拦截器,但 put 无效。当我的 sagas 调用工作正常的减速器时。

也许拦截器不能使用这种模式?有没有办法从拦截器调用reducer?

【问题讨论】:

【参考方案1】:

也许需要使用 applyMiddleware 将 saga 导出并添加到 redux,以便能够使用“put”来调度操作(?)。不完全确定在这种情况下如何实现。

我也遇到了类似的情况,我可以通过导入 store 来调度一个动作,然后使用 store.dispatch(myaction(data)); 调用该动作(我没有使用 saga)。

import myAction from 'actionCreators';
import store from 'store';

axios.interceptors.response.use(response => 

    if('dataProperty' in response.data)

        store.dispatch(myAction(response.data.dataProperty));

    
    return response;


【讨论】:

以上是关于与redux reducer结合的axios响应拦截器的主要内容,如果未能解决你的问题,请参考以下文章

Reducer 在使用 redux-promise 和 axios 时返回 undefined

React Apollo 和 Redux:将自定义 reducer 与 Apollo 状态相结合

Redux 工具包和 Axios

使用 redux 响应原生 axios api 调用

Redux axios 请求取消

使用 axios 和 redux 的正确方法