zoukankan      html  css  js  c++  java
  • js 对于链式加载的思考

    常规的思考

    A().B().C();

    那么 可以调用B方法依赖于 A()的返回值 即 A返回的对象有B方法属性

    ES6的proxy出现

    先看一段代码 

    var list = function(v) {
        var funstack = [];
        var tem = new Proxy({}, {
            get: function(obj, key, to) {
                if (key !== "get") {
                    funstack.push(window[key]);
                    return to;
                } else {
                    return funstack.reduce((i, j, a) => {
                        return j(i);
                    }, v);
                }
            }
        });
        return tem;
    }
    var double = n => n * 2;
    var pow = n => n * n;
    console.log(list(3).double.pow.get);

    是不是很神奇 链式加载 这个也可以叫做懒加载 (是不是有一个 很重要的名词 )promise 

    于是用Proxy重写了promise的简单方法 

    var myPromise = function(callback) {
        var me = this;
        me.flag = 0;
        me.no=false;
        me.thenarr = [];
        setTimeout(callback.bind(me, function(r) {
            me.result = r;
            me.flag = 1;
        }, function() {
            me.flag = -1;
        }), 0);
    }
    myPromise.prototype = {
        constructor: myPromise,
        then: function(callback) {
            var me = this;
            callback.call(me, me.result);
        }
    };
    var tem = new myPromise(function(r1, r2) {
        setTimeout(r1.bind(this, "1211212"), 2000);
    });
    var t = tem;
    tem.then = new Proxy(tem.then, {
        apply: function(t, k, args) {
            var me = this;
            if (!tem.no) {
                tem.thenarr=args[0];
                return;
            }
            return Reflect.apply(...arguments);
        }
    });
    Object.defineProperty(tem, "flag", {
        set: function(v) {
            t[v] = v;
            tem.no = true;
            tem.then(tem.thenarr);
        }
    })
    tem.then(function(r) {
        console.log(r);
    })

    使用thenarr来保存 then的参数 就是函数 调用的时候我判断 promise的标记物 保存 然后 当异步出现之后 加了一个触发器 就链式调用了then函数 同时传入参数

  • 相关阅读:
    Android安卓 _“Activity"_01+简单的拨号器
    Android安卓 “内部类”
    我的第一天 Andorid “hello_world”
    Android sqlite 创建数据库
    Sqlite(代码 jabc)
    判断网络状态
    Android sqlite(jdbc)
    Android 单机事件的使用
    JAVA内部类(成员.局部.匿名)
    我的第一个Android程序
  • 原文地址:https://www.cnblogs.com/me-data/p/9860454.html
Copyright © 2011-2022 走看看