2010-08-12 170 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

相關問題