对于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
动作时,它似乎也没有被触发。
经过几个小时的测试,阅读文档和教程我不得不承认失败。请帮忙。
答案 0 :(得分:0)
实际上,这个问题有正确的答案作为评论: redux-saga cannot catch actions dispatched by store enhancers
问题是撰写函数的参数顺序。 这样组成时效果很好:
const enhancers = compose(
applyMiddleware(...middleware),
window.devToolsExtension ? window.devToolsExtension() : f => f
)