Javascript Firefox插件sdk同步请求

Javascript Firefox插件sdk同步请求,javascript,ajax,firefox,firefox-addon-sdk,Javascript,Ajax,Firefox,Firefox Addon Sdk,我正在尝试构建一个firefox扩展,它将在远程网站上实现一个登录表单。基本上,分机将通过点击地址栏附近的分机图标打开一个弹出窗口。我使用此模块实现的弹出行为 当我第一次尝试构建javascript登录脚本时,我用一个数据脚本(而不是main.js)实现了对远程网站的ajax调用。这个解决方案是错误的,因为据我所知,数据脚本中不支持ajax调用,我需要使用main.js中的请求模块来实现。接下来,我在main.js中使用了请求模块,并编写了下一个代码: js(弹出窗口中使用的数据文件夹内的脚本

我正在尝试构建一个firefox扩展,它将在远程网站上实现一个登录表单。基本上,分机将通过点击地址栏附近的分机图标打开一个弹出窗口。我使用此模块实现的弹出行为

当我第一次尝试构建javascript登录脚本时,我用一个数据脚本(而不是main.js)实现了对远程网站的ajax调用。这个解决方案是错误的,因为据我所知,数据脚本中不支持ajax调用,我需要使用main.js中的请求模块来实现。接下来,我在main.js中使用了请求模块,并编写了下一个代码:

js(弹出窗口中使用的数据文件夹内的脚本)

梅因。js

var popup = badge.BrowserAction({
    default_icon: data.url("icon.png"),    
    default_popup: data.url("popup.html")      
}) 

popup.onMessage.addListener(function(message, sender, sendResponse) {

      if(message.action == 'login'){
             sendResponse(login(message.data));
      } 
});
function login(data  ){ 

    var ret;
    login = Request({
          url: url,
          content:data, 
          onComplete: function (response) {   
                ret = response.json;
          }
    });
    login.get();

        return ret;
}
因为请求是异步的,所以我会将空响应发送回data.js。我查看了请求模块文档,但没有找到解决方案

是否有人拥有或知道解决此问题的解决方案


谢谢大家!

其实很简单-在得到响应之前不要调用
sendsresponse
。您可以将
sendResponse
函数作为回调传递给您的
login
函数:

popup.onMessage.addListener(function(message, sender, sendResponse) {
      if(message.action == 'login'){
             login(message.data, sendResponse);
      }
      return true;
});
function login(data, callback){
  ...
  onComplete: function(response) {
    callback(response.json);
  }
  ...
}

仍然不工作,data.js上收到的响应仍然是空的。@Marius:请随意调试您的代码-空响应必须来自某处;)。上面的代码将
response.json
传递到
sendResponse
,因此您可能在某处留下了另一个
sendResponse
调用,或者
response.json
确实是空的。@WladimirPalant您还应该将
返回true
在消息的
末尾
。否则,在调度回调后调用
sendResponse
,请参阅
popup.onMessage.addListener(function(message, sender, sendResponse) {
      if(message.action == 'login'){
             login(message.data, sendResponse);
      }
      return true;
});
function login(data, callback){
  ...
  onComplete: function(response) {
    callback(response.json);
  }
  ...
}