gpt4 book ai didi

JavaScript Pub/Sub 属性访问问题

转载 作者:行者123 更新时间:2023-11-30 18:19:35 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,希望大家能帮忙解决。

项目详情

我正在为一个包含 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”键,它引用一个 Subscription 对象数组。事实上,如果您引用主题 ["someevent"],您会看到一个包含单个订阅的数组。但是,如果您引用主题,您会看到“someevent”键,但数组是空的!

通过注释掉 pubsub.unsubscribe(sub);问题被消除了,即使在我们运行 console.log(topics) 之后这个函数似乎没有被触发。 .

此外,这似乎不是给定浏览器“线程”方式的问题console.log ;尝试 console.log(topics, topics[topic], topics, topics[topic])你会得到相同的结果。

演示:http://jsfiddle.net/4Ab6c/

我们将非常感谢任何帮助!谢谢。

最佳答案

我仍在寻找一些文档来支持我,但我怀疑控制台中的对象显示正在对您的 topics 对象执行惰性评估。在 sub 被推送到数组后,我将 console.log(topics) 添加到 subscribe 方法中,我得到的结果与你的 'but不在这里'日志。当我将你的 fiddle pubsub.publish('someevent') 的最后一行包装在 setTimeout 中时,我在 publish 之前打开了对象树回调运行,然后它在数组中显示订阅,即使在回调运行后它也保持这种状态。如果在回调运行之前我没有在控制台中打开对象树,那么我会看到空数组。

我会继续搜索博客文章或确认惰性评估正在发生的内容。

以防万一我说得不够明显,懒惰的意思是,在控制台中单击打开 TreeView 之前,控制台不会收集对象的详细信息。

我在 Chrome 中工作。

更新

我在 Firefox 上也发现了类似的行为。 Firefox 识别出数组中有一个对象,但如果您在发布甚至触发之前不向下钻取到数组,那么对数组的向下钻取将为空。

我根据您的评论更新了 fiddle :

http://jsfiddle.net/4Ab6c/2/

请试试这个:

  • 运行 fiddle 并在发布事件触发前展开第一个 console.log 的对象树,我将它设置为五秒超时,但您可以将其设置得更长或更短,具体取决于您可以放下的速度到控制台并单击检查器打开。

  • 您应该按预期在数组中看到订阅对象。

  • 清除控制台并再次运行 fiddle。这一次,在触发发布事件并且所有代码运行完毕之前,不要打开对象检查器。

  • 现在,当您打开第一个 console.log 的对象检查器时,您应该看不到数组中的订阅事件。

更新 2这是一个表现出相同行为的更简单的 fiddle :

http://jsfiddle.net/4Ab6c/3/

如果您在第二个出现之前先展开,那么您将得到 foo: bar。如果您在第二个出现后先展开,您将得到 foo: baz。

更新 3

然后,瞧,another SO question延迟评估的动议。

关于JavaScript Pub/Sub 属性访问问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com