Javascript Firefox扩展:self.port.on未将结果传递给外部函数

Javascript Firefox扩展:self.port.on未将结果传递给外部函数,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,main.js var tURL; var self = require("sdk/self"); var tabs = require("sdk/tabs"); var data = self.data; /* contentScriptFile: [data.url("scripts/lib/jquery.js"), data.url("scripts/lib/jquery-ui.js"), data.url(

main.js

var tURL;
var self = require("sdk/self");
var tabs = require("sdk/tabs");
var data = self.data;

/*
contentScriptFile: [data.url("scripts/lib/jquery.js"),
                    data.url("scripts/lib/jquery-ui.js"),
                    data.url("scripts/platform.js")];
*/
// First time install
if (require('sdk/self').loadReason == 'install') {
  // Do something on the very first install
  tabs.open("http://www.example.com/test2.php");
}

require("sdk/tabs").on("ready", logURL);
function logURL(tab) {
  tURL = tab.url;
  console.log("LOGURL: "+tURL);

  var worker = tabs.activeTab.attach({
    contentScriptFile: [data.url("scripts/lib/jquery.js"),
                        data.url("scripts/platform.js"),
                        data.url("scripts/script.js")]
  });
  worker.port.emit("vsAPI", tURL);


  worker.port.on('getURL', function(callback) {
    var gotURL = data.url(callback);
    worker.port.emit("gotURL", gotURL);
  });

}
function Platform() {
  var that = this;

  that.getURL = function (filename) {

    self.port.emit('getURL', filename);

    self.port.on("gotURL", function(callback) {
      console.log("gotURL: "+callback);
      var output = callback;
    });
    //console.log("output: "+output);
    return output;

  }
}
platform.js

var tURL;
var self = require("sdk/self");
var tabs = require("sdk/tabs");
var data = self.data;

/*
contentScriptFile: [data.url("scripts/lib/jquery.js"),
                    data.url("scripts/lib/jquery-ui.js"),
                    data.url("scripts/platform.js")];
*/
// First time install
if (require('sdk/self').loadReason == 'install') {
  // Do something on the very first install
  tabs.open("http://www.example.com/test2.php");
}

require("sdk/tabs").on("ready", logURL);
function logURL(tab) {
  tURL = tab.url;
  console.log("LOGURL: "+tURL);

  var worker = tabs.activeTab.attach({
    contentScriptFile: [data.url("scripts/lib/jquery.js"),
                        data.url("scripts/platform.js"),
                        data.url("scripts/script.js")]
  });
  worker.port.emit("vsAPI", tURL);


  worker.port.on('getURL', function(callback) {
    var gotURL = data.url(callback);
    worker.port.emit("gotURL", gotURL);
  });

}
function Platform() {
  var that = this;

  that.getURL = function (filename) {

    self.port.emit('getURL', filename);

    self.port.on("gotURL", function(callback) {
      console.log("gotURL: "+callback);
      var output = callback;
    });
    //console.log("output: "+output);
    return output;

  }
}
问题:

platform.js发送到main.js

main.js接收、处理并将结果传回platform.js

platform.js成功接收结果

但是,我想在port.on函数之外使用结果

即:

我想在self.port.on(“gotURL”)之外使用“var输出”

你知道我需要调整什么吗


谢谢

这更多的是一个一般的Javascript问题,而不是附加SDK特有的问题。对于或,这里有同样的东西

您基本上有两种选择:

  • 创建一个全局变量并从回调中分配给它。例如

    // will be undefined at first, of course
    var output;
    self.port.on("gotURL", function(callback) {
      console.log("gotURL");
      output = callback;
    });
    setInterval(function() {
       console.log("output: " + output);
    }, 1000);
    
    输出将如下所示(即,
    output
    首先未定义,直到
    gotURL
    消息通过):

  • 全局变量总是有一种骇人的感觉,所以只需坚持正确的回调

    self.port.on("gotURL", function(callback) {
      console.log("gotURL");
      myOtherAPI.doSomething(callback);
    });
    

  • 很好的回答。。。。那么,在我的情况下,这将如何工作?script.js是在网页上加载html的主脚本。。。。它请求图像URL
    code
    platform.getURL(“images/vsicon.png”)
    code
    …请求被传递到中间脚本platform.js
    code
    function getURL(){self.port.on(“gotURL”,函数(回调){console.log(“gotURL”);myOtherAPI.doSomething(回调);}
    code
    …平台对main.js进行port.emit调用。。。在您的示例中,如何在另一个函数中将回调传递给getURL()?