Thunkify实现自执行函数

Thunkify实现自执行函数

1.前言:

我们经常会有一些异步转同步的需求,比如链式执行就在很多插件中使用,而插件中的代码即可能是同步的也可能是异步的情况,所以我们需要提供一个函数能够:

  1. 顺序执行。
  2. 中间步骤控制。
  3. 异步/同步一致化处理。

这就是自执行函数的功能,自执行函数的作用是将generator函数转换为同步化顺序执行的函数。

2.实现代码:

      function thunkify(fn) {
            return function () {
                let args = Array.from(arguments);
                return function (callback) {
                    let called;
                    let proxyCallBack = function () {
                        if (called) {
                            return;
                        }
                        called = true;
                        callback.apply(null, Array.from(arguments));
                    }
                    let wholeArgs = [...args, proxyCallBack];
                    try {
                        return fn.apply(this, wholeArgs);
                    }
                    catch (err) {
                        callback(err);
                    }
                }
            }
        }

        function demo(arg,next){
            console.log("demo"+arg+" done");
            next();
        }

        let fnThunk = thunkify(demo);

        //执行器生产函数
        function * gen(){
            yield fnThunk(1);
            yield fnThunk(2);
        }

        //执行器
        function run(g){
            let genInstance = g();
            let next = function(){
                let res = genInstance.next();
                if(!res || res.done) return;

                res.value(next);
            };
            next();
        }

        run(gen);

        //输出结果
        //demo1 done
        //demo2 done

上面代码很容易理解(当然你可能需要理解curry函数generator函数),关键代码是这里:


            let next = function(){
                let res = genInstance.next();
                if(!res || res.done) return;

                res.value(next);
            };

我们将generator函数的next封装到一个内部函数里面,然后传入res.value(这个其实就是


        function demo(arg,next){
            console.log("demo"+arg+" done");
            next();
        }

中的next参数),这样是否进入下一步就可以由被执行的函数在内部判断,把next放到异步函数resolve或者reject回调内部执行就可以将异步函数转化为(至少外部看起来)同步函数。通过这个处理我们就可以做出类似react-redux plugin或者 vue-router的beforeEach函数的功能来,是非常非常有用的函数概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值