2013-10-25 34 views
1

我试图构建一个firefox扩展,将在远程网站上实现登录表单。基本上,扩展程序将通过单击地址栏附近的扩展名图标打开一个弹出窗口。我所取得的弹出行为使用此模块火狐插件sdk同步请求

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

第一次当我试图建立的JavaScript登录脚本我实现了在数据脚本中的AJAX调用远程网站不main.js.这个解决方案是错误的,因为从我读过的数据脚本中不支持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; 
} 

因为请求是异步的我得到空的响应发回data.js.我查看了请求模块文档并没有找到解决方案。

有没有人有或知道解决方案来解决这个问题?

谢谢!

回答

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); 
    } 
    ... 
} 
+0

仍然没有工作,响应收到的data.js仍然是空的。 – Marius

+0

@Marius:随意调试你的代码 - 空的响应必须来自某处;)。上面的代码将'response.json'传递给'sendResponse',所以无论您在某处放置了另一个'sendResponse'调用还是'response.json'确实是空的。 –

+0

@WladimirPalant你也应该在'onMessage'结尾处加上'return true;'。否则,在调用回调之后调用'sendResponse' - 请参阅https://github.com/Rob--W/browser-action-jplib/blob/aab25cf0e4a6be00699b7689e8f3844b9ca977d1/lib/messaging.js#L96-L101 –