2015-11-12 207 views
0

我正在做一個chrome擴展,通過彈出窗口阻止添加到本地存儲的特定站點。我認爲這個代碼中的問題是,它在chrome.storage.local.get的回調完成之前返回。如何在返回之前等待一段時間?同步執行異步功能

chrome.webRequest.onBeforeRequest.addListener(
function(details) { 

var matched = false; 

chrome.storage.local.get ('blocked_sites', function (sites) { 
    var bsites = sites.blocked_sites; 
    for (i = 0, size = bsites.length; i < size; i++) { 
    if (details.url.indexOf("://" + bsites[i] + "/") != -1) { 
     matched = true; 
    } // end if 
    } // end for 

}); 
// WAIT HERE FOR VALUE OF MATCHED TO BE SET BY CALLBACK 
return { cancel: matched }; 
}, 
{ urls: ["<all_urls>"] }, 
["blocking"]); 

chrome.storage.local.set({'blocked_sites': [ 'www.topnotchdev.com'] }, null); 
+3

你不能讓它等待。您只能將代碼重寫爲異步。 – Bergi

+0

是的,我試圖讓它通過使用循環等待,並阻止線程。告訴我如何重寫它? – mallaudin

回答

2

不能調用任何異步函數在webRequest阻止聽衆。這是沒有辦法的,哈克或其他。由於JavaScript是單線程的,因此基本上是不可能的;在當前函數完成執行之前,異步操作甚至不會啓動。

這意味着你不能依賴異步存儲;您必須擁有本地同步緩存。

blocked_sites保存爲變量,並在chrome.storage.onChanged事件中更新它。這樣,您將擁有設置的同步緩存。

+0

感謝您的快速回復@Xan。但局部變量會在腳本執行後破壞,我將如何在下一次執行腳本時填充它? – mallaudin

+1

從'chrome.storage'。不要在'webRequest'監聽器中調用'chrome.storage'。 – Xan

+0

在代碼中發表評論也不起作用。提出一個新問題(因爲這個問題已經收到了一些答案)。在你做之前,試着自己想一些。 – Xan

0

隨着您的代碼結構化,您將無法在回調後執行return { cancel: matched };。原因是因爲return { cancel: matched };運行在一個執行框架(與調用chrome.storage.local.get相同)並且回調在未來的某個執行框架中運行。當你調用異步方法時,只有在回調執行的時候return { cancel: matched };已經執行,它才能將回調插入到事件循環中。