Sagas不会触发其他传奇和动作

时间:2017-01-02 04:44:59

标签: javascript redux redux-saga

对于redux-saga来说,我遇到了一个简单且非常常见的用例问题。我正在尝试调用API以使用初始数据集填充我的redux存储。要做到这一点,我试图在启动时运行一个传奇。

store.js的相关部分如下:

const reduxRouterMiddleware = routerMiddleware(browserHistory)
const sagaMiddleware = createSagaMiddleware()
const middleware = [reduxRouterMiddleware, sagaMiddleware]

const enhancers = compose(
  window.devToolsExtension ? window.devToolsExtension() : f => f,
  applyMiddleware(...middleware)
)

const store = createStore(rootReducer, defaultState, enhancers)

sagaMiddleware.run(rootSaga)

export const history = syncHistoryWithStore(browserHistory, store)
export default store

我的sagas.js文件看起来像这样:

export function* fetchListings() {
  try {
    console.log('fetchListings saga - try')
    const response = yield call(api.get, '/api/listings')
    console.log(response.data.listings)
    yield put({type: 'FETCH_LISTINGS_SUCCESS', listings: response.data.listings})
  }
  catch (err) {
    console.log('fetchListings saga - error')
    yield put({type: 'FETCH_LISTINGS_ERROR', error: err})
  }
}

export function* listenFetchListings() {
  yield takeEvery('FETCH_LISTINGS_REQUEST', fetchListings)
  console.log('watcher saga')
}

export default function* rootSaga() {
  yield fork (fetchListings)
}

当页面加载时,我可以看到对被激活的API的请求,控制台日志显示预期的有效负载返回。不幸的是,FETCH_LISTINGS_SUCCESS操作未被分派。当我从ReduxDevTools手动发送它时,它会很好地修改我的状态。 出于测试目的,我还添加了listenFetchListings saga来尝试使用显式调用来测试它。不幸的是,当我手动调度FETCH_LISTINGS_REQUEST动作时,它似乎也没有被触发。 经过几个小时的测试,阅读文档和教程我不得不承认失败。请帮忙。

1 个答案:

答案 0 :(得分:0)

实际上,这个问题有正确的答案作为评论: redux-saga cannot catch actions dispatched by store enhancers

问题是撰写函数的参数顺序。 这样组成时效果很好:

const enhancers = compose(
  applyMiddleware(...middleware),
  window.devToolsExtension ? window.devToolsExtension() : f => f
)