2016-01-06 85 views
4

使用redux-api-middleware我遇到了一个问题,其中只有一个减速器功能没有触发。Redux减速器不被称为

我想以类似的方式处理失败的api请求,如何处理成功的api请求。然而,据我所知,FSA永远不会被处理,尽管它的处理(AFAICT)与SEARCH_SUCCESS FSA相同。它似乎是根据我在devtools中看到的内容创建和发送的。

我有这个

import { CALL_API } from 'redux-api-middleware' 
import { handleActions } from 'redux-actions' 
const searchReducer = handleActions({ 

//... other handlers elided 

SEARCH_SUCCESS: (state = defaultState, action) => { 
    return { 
    ...state, 
    search_results: ({...action.payload}), 
    api: { 
     requestPending: false, 
     searchPending: false 
    }, 
    } 
}, 

SEARCH_FAILURE: function(state = defaultState, action) { 
    console.log("Handling SEARCH_FAILURE given state, action: ", state, action) 

    return { 
      ...state, 
      search_results: {Total: 0}, 
      api: { 
       requestPending: false, 
       error: action.payload 
       }, 
      errors: [action.payload, ...state.errors] 
     } 
}, 
}) 

SEARCH_SUCCESS FSA得到由searchReducer处理,但是当服务器对400响应,SEARCH_FAILURE处理程序不会被调用 - 至少我没有看到日志输出I会期待,而且国家肯定不会看起来很正确。但是,我确实在redux devtools面板中看到了SEARCH_FAILURE条目。

服务,以进一步迷惑我,这里是我的声明有目前用于创建RSAA

export function doSearch(selected_filters, page){ 
let qs = SearchPage.constructQueryString(selected_filters, page) 

return { 
    [CALL_API]: { 
    endpoint: `/api/songs/search?${qs}`, 
    method: 'GET', 
    types: [ 
     {type: SEARCH_REQUEST}, 
     {type: SEARCH_SUCCESS}, 
     { 
      type: SEARCH_FAILURE, 
      payload: (action, state, res) => { 
       if (400 === res.status) 
        { 
        console.log(`${SEARCH_FAILURE} payload: `, action, state, res) 
        } 
       return res 
       } 
      }, 
     ], 
     headers: { 'Content-Type': 'application/json' }, 
     credentials: 'include' 
    } 
    } 
} 

的​​功能被称为和记录或多或少我的期望。那么我在这里搞什么?据我所知,redux-api-middleware的文档多次阅读,这种设置应该产生我想要的行为,但事实并非如此。成功取得成功,但失败失败...

+0

尝试在reducer文件(在定义reducer后的全局范围内)以及错误有效内容函数内打印SEARCH_FAILURE的值。总有机会他们是不同的价值观! – Brandon

回答

0

我遇到了类似的问题,当我用一个对象定义我的一个类型而不是像你为SEARCH_FAILURE所做的那样操作时。我最终通过更新我的package.json与固定:

"redux-api-middleware": "^1.0.0-beta3", 

我认为问题是,该文档描述了1.0.0版本的API,但是当你:

npm install redux-api-middleware --save 

你最终得到该软件包的早期版本。