2010-08-12 112 views
1

有一个问题,同时通过使用脚本内容在谷歌浏览器扩展程序开发的消息 我的代码结构如下:Chrome扩展程序开发:消息传递问题

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

当我在我的popup.html把一个断点“oList = response.dom;”调试我的代码,我从内容脚本中获得了设置为 的右侧值。但在执行扩展时,popup.html中的“alert("oList = "+oList);”代码 似乎在它进入服务器之前先执行。因此,其值为 未设置..有人可以告诉我,如果我错了某处?

+0

它的表现很奇怪。如果我做了一个“审查弹出”无断点,它的工作。如果我只是清楚地执行,它只是不跑!我在响应中添加了console.logs(),看到它没有执行。但是当我调试时,代码正在进入..我能够在控制台中看到日志,并且还能够获取警报。为什么这很开心? – sharath 2010-08-13 00:00:47

回答

5

大多数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

谢谢..但那就是我做的对吗?我的'sendRequest'的代码是'oList = response.dom''应该将该值设置为oList。这是调试时设置,但不是在执行时:( – sharath 2010-08-13 00:28:59

+0

我添加一个console.log(“oList =”+ oList);但我看到的结果只在调试时在控制台..不是当我执行:( – sharath 2010-08-13 00:30:49

+1

@paypalcomp这不是你正在做的事情,你的任务在显示之前不会发生,想象你有大量的数据要传输,并且需要1个小时,你的代码将按如下顺序执行:'var oList ;'紧接着'alert(oList);'(不等待数据加载),然后在1小时后:'oList = response.dom;'现在你的数据量变小了,所以只需要很少的毫秒的回调得到触发,但它仍然发生比你的警报晚数毫秒。 – serg 2010-08-13 01:14:27

相关问题