我在这里遇到了一个奇怪的问题,希望大家能帮忙。
项目详情
我正在为一个包含pubsub.subscribe_once()
方法的大型应用程序开发一个简单的发布/订阅实现。此方法可以创建一次性订阅,这意味着创建通用订阅,然后一旦触发正确的“发布”事件并运行订阅回调,订阅就会自行删除。
subscribe_once: function(topic, func) {
var sub = pubsub.subscribe(topic, func),
old_func = sub.func;
// rewrite our subscription's method to remove itself after invocation
sub.func = function() {
// call the original function
old_func.apply(this);
// remove subscription from topic
pubsub.unsubscribe(sub);
};
return sub;
}
问题
我似乎对这个过程的内存流有某种问题。(为了更好地理解下面的解释,我建议你边走边看下面的 jsfiddle 演示。)我创建了一个 subscribe_once('someevent') 订阅,然后触发 publish('someevent')。当调用 publish 方法时,您希望看到主题哈希表包含一个“someevent”键,它引用了一个订阅对象数组。事实上,如果您引用主题["someevent"],您会看到一个包含单个订阅的数组。但是,如果您引用主题,您会看到“someevent”键,但数组是空的!
通过注释掉pubsub.unsubscribe(sub);
问题可以消除,即使这个函数直到我们运行之后才被触发console.log(topics)
。
此外,这似乎不是给定浏览器“线程”方式的问题console.log
;尝试console.log(topics, topics[topic], topics, topics[topic])
,您会得到相同的结果。
演示:http: //jsfiddle.net/4Ab6c/
任何帮助将不胜感激!谢谢。