【javaScript随笔】03 一个简单的js代理

思考起源于这样一个问题:

如果一个A对象的加载时机很难把握,那么我们调用他方法的时候,就很难控制。

这样子我们就需要做一个代理对象Proxy,调用A对象上面的方法时,可以统一把消息推送到Proxy上,Proxy将消息存到一个队列里面,然后去嗅探A是否加载,如果A加载完毕,Proxy再把队列里面的消息推送给A。

simple is best ! 

举一个简单的例子:

下面的对象是一个服务对象,它的加载时机无法把握。

// 该对象用于处理逻辑
window.Service = {
    // 加载完成的标识
    load:true, 
    // add是一个数组求和方法
    add: function(numList, callback){
        var res = 0;
        for(var i = 0; i < numList.length; i++){
            res += numList[i];
        }
        callback.call(this, res);
    }
};

可以如下调用Service

window.Service.add([1,2], function(res){
    console.log(res);
});

window.Service.add([1,2,4], function(res){
    console.log(res);
});

基于上面逻辑,可以简单构造一个Proxy

window.Proxyer = {
    queue: [], // 消息队列
    isRun: false, // 判断是否已经在嗅探的标识
    add: function(numList, callback) {
        this.queue.push({ // 方法添加到队列里面
            numList: numList,
            callback: callback
        });
        if(!this.isRun) { // 防止反复启动嗅探
            this.loopSmell();
        }
    },
    loopSmell: function(){
        var _this = this;
        setTimeout(function(){
            if(!window.Service.load) {
                _this.isRun = true;
                _this.loopSmell();
            }else{
                while(_this.queue.length) { // 处理消息
                    var msg = _this.queue.shift();
                    window.Service.add(msg.numList, msg.callback);
                }
                _this.isRun = false;
            }
        }, 0);
    }
};

上面的Proxy不完美,只简单做了 针对Service 且针对add方法的消息推送。

那么Servie就可以直接调用,不需要关心Servie是否加载。

window.Proxyer.add([1,2,5,5,5], function(res){
    console.log(res);
});

window.Proxyer.add([1,2,4,5,5,5,5], function(res){
    console.log(res);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三和小钢炮

谢谢客官~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值