Firefox插件sdk同步请求

时间:2013-10-25 21:22:27

标签: javascript ajax firefox firefox-addon-sdk

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

https://github.com/Rob--W/browser-action-jplib

我第一次尝试构建javascript登录脚本时,我在不在main.js的数据脚本中实现了对远程网站的ajax调用。这个解决方案是错误的,因为从我读过的数据描述中不支持ajax调用,我需要在main.js中使用请求模块。为此,我使用了main.js中的请求模块,然后进入下一个代码:

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

 extension.sendMessage(
         {
              action:"login",
              data:{user:user,password:password}
         },function(r){
    //Handle server response. If ok show post login screen if not show invalid credentials.
  });

主。 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;
}

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

实际上非常简单 - 在得到回复之前不要致电sendResponse。您可以将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);
  }
  ...
}