js观察者模式

//由于这些成员对于任何发布者对象都是通用的,故将它们作为独立对象的一个部分来实现是很有意义的。那样我们可将其复制到任何对象中,并将任意给定对象变成一个发布者。
var pubsub = {};
(function (q) {

    var topics = {}; // 回调函数存放的数组
    var subUid = -1;
    /**
     * 发布方法
     * topic	订阅id
     * args		参数
     * return 	成功返回true, 失败返回false
     */
    q.publish = function (topic, args) {
        if (!topics[topic]) {
            return false;
        }
        setTimeout(function () {
            var subscribers = topics[topic],
                len = subscribers ? subscribers.length : 0;
            while (len--) {
                subscribers[len].func(topic, args);
            }
        }, 0);

        return true;

    };
    /**
     * 订阅方法
     * topic	订阅id
     * func		调用函数
     * return 		返回订阅id
     */
    q.subscribe = function (topic, func) {

        if (!topics[topic]) {
            topics[topic] = [];
        }
        //var token = (++subUid).toString();
        topics[topic].push({
            token: topic,
            func: func
        });
        return topic;
    };
    /**
     * 订阅方法Confirm(该方法专为confirm定制, 不可修改)
     * parameter	参数对象
     * func			调用函数
     * return 		返回订阅id
     */
    q.subscribeConfirm = function (parameter, func) {
    	oDragConfim(parameter);//弹出自定义confirm框
    	
    	var topic = parameter.topic;//"confirm";
    	pubsub.unsubscribe(topic);先删除以前的订阅
        if (!topics[topic]) {
            topics[topic] = [];
        }
        //var token = (++subUid).toString();
        topics[topic].push({
            token: topic,
            func: func
        });
        
        return topic;
    };
    /**
     * 退订方法
     * token 根据token删除
     * return 成功返回token, 失败返回false
     */
    q.unsubscribe = function (token) {
        for (var m in topics) {
            if (topics[m]) {
                for (var i = 0, j = topics[m].length; i < j; i++) {
                    if ( topics[m][i].token === token) {
                        topics[m].splice(i, 1);
                        return token;
                    }
                }
            }
        }
        return false;
    };
} (pubsub));
/*
//(undefined!=fun2) ?pubsub.unsubscribe(fun2):"";
//("undefined" != typeof fun2)?pubsub.unsubscribe(fun2):"";
//来,订阅一个
var token0 = pubsub.subscribe('example1', fun1 = function (topics, data) {
    console.log(topics + ": " + data);
});
//alert(token0);
//来,再订阅一个
var token1 = pubsub.subscribe('example', fun2 = function (topics, data) {
    console.log(topics + "******* " + data);
});

pubsub.subscribeConfirm('confirm', funConfirm = function (topics, data) {
    console.log(topics + "******* " + data);
}); 
//alert(token1);
//pubsub.unsubscribe(fun2)

//发布通知
pubsub.publish('example1', 'hello world!');
pubsub.publish('example1', ['test', 'a', 'b', 'c']);
pubsub.publish('example', [{ 'color': 'blue' }, { 'text': 'hello'}]);


//pubsub.publish('confirm', 'true');

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值