122thunk源码解析

function thunkMiddleware(twoParameters) {//一、(1)在项目初始化阶段,通过applyMiddleware,将getState和改造后的dispatch传入thunk函数并执行
    var afterDispatch = twoParameters.afterDispatch;
    var getState = twoParameters.getState;
    return function (beforeDispatch) {//(2)得到返回值函数functionA,将改造前的dispatch传入functionA函数并执行
        return function (action) {//(3)得到返回值函数functionB。二、(4)在项目进行阶段,给functionB传参,并将执行结果传到改造前的dispatch
            if (typeof action === 'function') {//(4)如果functionB的实参是函数
                return action(afterDispatch, getState);//(5)则把getState和改造后的dispatch传入到这个函数并执行
            }
            return beforeDispatch(action);//(6)如果functionB的实参不是函数,则把实参传入改造前的dispatch并执行。 
        };
    };
}

//1、createStore执行
createStore(
    rootReducer,
    preloadedState,
    compose(
        applyMiddleware(thunkMiddleware),
        DevTools.instrument()
    )/*这是增强函数*/
);
//2、compose定义
function compose() {
    for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) {
        funcs[_key] = arguments[_key];
    }
    return funcs.reduce(function (a, b) { /*a为compose的第1个参数,b为compose的第2个参数,*/
        return function () {/*返回值为增强函数*/
            return a(b.apply(undefined, arguments));
        };
    });
}
//3、compose执行
var arrayFunction = [functionA, functionB, functionC, functionD];
function compose(arrayFunction) {
    return arrayFunction.reduce(function (a, b) {
        return function () {
            return a(b.apply(undefined, arguments));
        };
    })
}
compose(arrayFunction)(functionLast);//第二层参数传入第一层参数的倒数第一个函数执行,将结果传入倒数第二个函数执行,再将结果传入倒数第三个函数执行......
//第一次循环后的结果为
function functionOne() {
    return functionA(functionB.apply(undefined, arguments));
}
//第二次循环后的结果为
function functionTwo() {
    return functionOne(functionC.apply(undefined, arguments));
}
//第三次循环后的结果为
function functionThree() {
    return functionTwo(functionD.apply(undefined, arguments));
}
//给第三次循环后的结果传参并执行functionThree(functionLast)。

ReactDOM.render(
    <Provider store={store}>
        <div>
            <Router onUpdate={() => window.scrollTo(0, 0)} history={browserHistory} children={routes}></Router>
        </div>
    </Provider>,
    document.getElementById('app')
)

  

转载于:https://www.cnblogs.com/gushixianqiancheng/p/11118774.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值