js观察者模式

来源:互联网 发布:js传值到html 编辑:程序博客网 时间:2024/06/05 14:27
//由于这些成员对于任何发布者对象都是通用的,故将它们作为独立对象的一个部分来实现是很有意义的。那样我们可将其复制到任何对象中,并将任意给定对象变成一个发布者。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');*/

原创粉丝点击