//由于这些成员对于任何发布者对象都是通用的,故将它们作为独立对象的一个部分来实现是很有意义的。那样我们可将其复制到任何对象中,并将任意给定对象变成一个发布者。
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');
*/
js观察者模式
最新推荐文章于 2022-10-15 21:37:14 发布