Chrome扩展程序开发:消息传递问题

Chrome Extension Development : Message passing Problem

提问人:sharath 提问时间:8/13/2010 最后编辑:sharath 更新时间:8/13/2010 访问量:1242

问:

在 Google chrome 扩展程序开发中使用内容脚本传递消息时遇到问题 我的代码结构如下所示:

弹出窗口 .html:

var oList;
function getHTML()
{
    chrome.tabs.getSelected(null, function(tab) {
     chrome.tabs.sendRequest(tab.id, {action:"getHTML"}, function handler(response) {
      oList = response.dom;
     });
   });

   alert("oList = "+oList );
}

我的内容脚本如下所示:

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
  if(request.action == "getHTML"){
   sendResponse({dom: document.getElementsByTagName("HTML").length});   
     }
  });

当我通过在弹出窗口 .html 中的“”处放置断点来调试代码时,我得到 从内容脚本中设置的正确值。但是在执行扩展时,“”代码 从弹出窗口中,.html 似乎在进入服务器之前先执行。.因此,它的价值是 未设置。.有人可以告诉我我是否在某个地方错了吗?oList = response.dom;alert("oList = "+oList );

javascript google-chrome-extension chromium

评论

0赞 sharath 8/13/2010
它的行为真的很奇怪。如果我做一个没有断点的“检查弹出窗口”,它就可以工作了。如果我只是简单地执行,它就是不运行!我在响应中添加了console.logs(),发现它只是没有执行。但是当我调试时,代码正在进入......我能够在控制台中看到日志,并且还能够获得警报。为什么是这个 happ ?

答:

5赞 serg 8/13/2010 #1

大多数 Chrome API 方法都是异步的。这意味着当您调用它们时,脚本不会等待它们的响应,而只是继续执行。如果你想在响应上执行一些东西,你应该把它放在回调函数中:

chrome.tabs.getSelected(null, function(tab) {
 chrome.tabs.sendRequest(tab.id, {action:"getHTML"}, function handler(response) {
  oList = response.dom;
  alert("oList = "+oList );
 });
});

评论

0赞 sharath 8/13/2010
谢谢。。但这就是我正在做的对吗?我的“sendRequest”具有代码“oList = response.dom;”,它应该将值设置为oList。这是在调试时设置的,而不是在执行时设置的:(
0赞 sharath 8/13/2010
我添加了一个控制台.log(“oList = ”+oList);。但是我只有在调试时才能在控制台中看到结果。当我执行:(时不会
1赞 serg 8/13/2010
@paypalcomp那不是你正在做的。您的分配不会在显示之前发生。想象一下,您有非常大的数据要传输,需要 1 小时。您的代码将按以下顺序执行:紧随其后(它不等待数据加载),然后在 1 小时后执行:.现在,您的数据量较小,因此只需几毫秒即可触发回调,但它仍然比您的警报晚几毫秒发生。var oList;alert(oList);oList = response.dom;