Redux reducer未被调用

时间:2016-01-06 18:01:53

标签: javascript reactjs redux

使用redux-api-middleware我遇到了一个问题,其中只有一个我的reducer函数没有触发。

我想以类似于处理成功的api请求的方式处理失败的api请求。但就我所知,SEARCH_FAILURE FSA永远不会得到处理,尽管它与SEARCH_SUCCESS FSA的处理方式相同(AFAICT)。根据我在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处理程序永远不会被调用 - 至少我看不到日志输出我希望,国家肯定不会看起来正确。但是,我确实在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'
     }
  }
}

调用payload函数 并且或多或少地记录我期望的内容。那么我在这里搞砸了什么?至于我可以从redux-api-middleware的文档的多个读数中辨别出来,这个设置应该产生我想要的行为,但事实并非如此。成功成功,但失败失败......

1 个答案:

答案 0 :(得分:0)

当我用一个对象定义我的一个类型而不是你正在为SEARCH_FAILURE做的动作时,我遇到了类似的问题。我最后通过更新我的package.json来修复:

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

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

npm install redux-api-middleware --save

您最终获得了该软件包的早期版本。