在2个插件脚本之间传递消息

时间:2014-04-17 11:12:08

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在抽象掉代码以专注于核心问题。我有一个main.js文件,需要第二个文件optionsmod.js

我希望能够从optionsmod.jsmain.js发送消息,以便main.js可以继续做其他事情。我不知道怎么做......

这是一个不起作用的例子。

main.js:

var optionsmod = require("optionsmod.js");
var self = require("sdk/self");

optionsmod.init();

self.port.on("message",function(){
        console.log("message received");
});

optionsmod.js:

var self = require("sdk/self");
function init(){
        console.log("here in init"); 
        //FOR THIS EXAMPLE, I'VE MADE THE CALL HERE. BUT WONT BE NORMALLY
        sendMessage();
}

function sendMessage(){
        self.port.emit("message");
        console.log("message sent");
}

exports.init = init;

我添加的代码不起作用,但有没有办法做类似的事情?

1 个答案:

答案 0 :(得分:1)

在模块之间没有默认的传递消息的方法。当 main.js 中发生事件时,很容易在 optionsmod.js 中发生某些事情。只需导出该功能并从 main.js 中调用它。但是,相反,它并不是那么简单。我处理这两种方法是通过传递回调函数和creating event targets。这是一个带回调函数的例子:

<强> main.js

var optionsmod = require("optionsmod.js");
var eventCallback = function(message) {
  console.log('message received: '+message);
};
optionsmod.init(eventCallback);

<强> optionsmod.js

exports.init = function(eventCallback) {
  foo.on('bar', function() {
    eventCallback('the message');
    console.log('message sent');
  });
};

替代方法是导出foo,然后从 main.js 调用foo.on,但这可能会破坏编写单独模块的整个目的,在这种情况下,我链接的文档会有所帮助。坦率地说,您可以使用这些文档来创建自己的专有邮件系统,但我认为您最好不要考虑上述条款。