一、redux-thunk是什么
咱们晓得,异步调用什么时候返回前端是无法控制的。对于redux这条紧密的数据流来说,如何能力做到异步呢?redux-thunk的根本思维就是通过函数来封装异步申请,也就是说在actionCreator中返回一个函数,在这个函数中进行异步调用。咱们都晓得,redux中间件只关注dispatch函数的传递,而且redux也不关怀dispatch函数的返回值,所以只须要让redux意识这个函数就能够了。
二、redux-thunk源码解读
function createThunkMiddleware(extraArgument) { return ({ dispatch, getState }) => next => action => { if (typeof action === 'function') { return action(dispatch, getState, extraArgument); } return next(action); };}const thunk = createThunkMiddleware();thunk.withExtraArgument = createThunkMiddleware;export default thunk;
乍一看,这不就是一个middleware吗?没错,redux-thunk就是一个middleware,惟一一点就是对action做了一下如下的判断:
if (typeof action === 'function') { return action(dispatch, getState, extraArgument);}
也就是说,如果发现actionCreator传过来的action是一个函数的话,会执行一下这个函数,并以这个函数的返回值作为返回值。后面曾经说过,redux对dispatch函数的返回值不是很关怀,因而此处也就无所谓了。
这样的话,在咱们的actionCreator中,咱们就能够做任何的异步调用了,并且返回任何值也无所谓,所以咱们能够这样调用promise了:
function actionCreate() { //返回的是一个函数 return function (dispatch, getState) { // 返回的函数体内自在实现。。。 fetch({xxx}).then(function (json) { dispatch(json); }) }}
通过redux-thunk,咱们将异步的操作交融进了现有的数据流中。
最初还要留神一点,因为中间件只关怀dispatch的传递,并不限度你做其余的事件,因而咱们最好将redux-thunk放到中间件列表的首位(也就是compose参数中的第一个,就是最初解决dispatch),避免其余的中间件中返回异步申请。