【发布时间】:2013-11-23 06:19:29
【问题描述】:
假设我正在使用具有高度模块化代码的 pub/sub 模式。当一个模块中的函数发出“发布”时,我如何明确其他模块中的哪些函数正在订阅该触发器?
例如:
// In module 1
function foo(data) {
publish("trigger", data);
}
// In module 2
function bar(data) {}
subscribe("trigger", bar);
// In module 3
function baz(data) {}
subscribe("trigger", baz);
在阅读模块 1 并看到“发布”已发送出去后,有人怎么知道在我的代码中查找订阅回调的位置?
一个明显的解决方案可能是注释哪些模块包含订阅触发器的函数,但在处理大量发布/订阅者时,这似乎是一个不切实际的解决方案。
我觉得我还没有完全理解如何使用 pub/sub 模式,因为对我来说,该模式似乎对函数链没有任何透明度。
编辑
我的问题是关于使我的代码清晰易懂,以便阅读我的源代码的人理解。我知道在运行时,我可以通过访问存储的回调数组以编程方式找到存储的订阅者列表。但这并没有让我的原始源代码更容易理解。
例如,我目前使用这样的模式:
// Main Controller Module
function foo(data) {
module2.bar();
module3.bar();
}
// In module 2
function bar(data) {}
// In module 3
function baz(data) {}
对于初学者来说,这个模块的正确术语是什么?我认为这是一个“中介者”模式,但看看here,似乎中介者模式更像我认为的 pub/sub 模式?
使用这种模式,我觉得我的代码流是完全透明的。读者无需四处寻找其他模块 foo() 可能调用的函数。
但是对于 pub/sub 模式,一旦我从 foo() 发出发布,就好像读者必须以某种方式找到订阅函数所在的模块。
当然,上述模式的缺点是严重依赖:模块 1 需要同时注入模块 2 和 3 才能调用 bar() 和 baz()。
所以我想采用 pub/sub 模式的松耦合,但我也想保持上述模式给我的功能流透明度。这可能吗?或者这只是发布/订阅模式的固有权衡?
到模组:
请删除问题。我写的这个问题很糟糕,想以更清晰的方式重新提出这个问题。谢谢。
【问题讨论】:
标签: javascript design-patterns publish-subscribe