RequireJS - 跨模块通信

时间:2012-03-29 13:06:43

标签: javascript requirejs

我目前正在使用介于所有模块之间的介体,并允许它们彼此之间进行通信。所有模块都必须通过调解器向所有正在收听的内容发送消息。我一直在阅读关于RequireJS的一些内容,但我没有找到任何文档如何最好地促进模块之间的通信。

我看过信号但是如果我理解正确的话,如果你通过调解员来运行信号,那么信号就不那么有用了。我只是想知道我还能尝试什么。我非常热衷于使用某种类型的回调模式,但是没有比调解器中的简单查找表更复杂。

以下是我发现的信号实现:https://github.com/millermedeiros/js-signals

以下是我发现的其他内容:http://ryanflorence.com/publisher.js/

是否存在针对此问题的标准化方法,或者必须一切都是依赖性驱动的?

2 个答案:

答案 0 :(得分:3)

使用集中式事件管理器是一种相当常见且相当可扩展的方法。从你的问题中很难说出你对事件模型有什么问题(如果有的话)。典型的事情如下(使用发布者):

文件1:

require(['publisher','module1'],function(Publisher,Module1) {
    var module = new Module1();
    Publisher.subscribe('globaleventname', module.handleGlobalEvent, module);
});

文件2:

require(['publisher','module2'],function(Publisher,Module2) {
    var module = new Module2();
    module.someMethod = function() {
        // method code
        // when method needs module1 to run its handler
        Publisher.publish('globaleventname', 'arguments', 'to', 'eventhandlers');
    };
});

这里的主要优点是松耦合;而不是知道其他对象的方法的对象,对象可以触发事件,而其他对象知道如何处理该特定的应用程序状态。如果不存在处理事件的对象,则不会抛出任何错误。

这种方法有什么问题?

答案 1 :(得分:3)

以下是您可能想要尝试的内容: https://github.com/naugtur/overlord.js

它可以比普通的出版商或调解员做多一点。它允许创建一个通用API来访问任何模块的任何方法。

这是一种无耻的插件,因为它是我自己的工具,但它似乎与这个问题非常相关。

已添加对require.js的支持。