我正在制作一个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);
答案 0 :(得分:2)
您无法在webRequest
阻止侦听器中调用任何异步函数。不管怎么说,hacky或其他方式。从根本上讲,这是不可能的,因为JavaScript是单线程的;在当前函数完成执行之前,异步操作甚至不会启动。
这意味着您不能依赖异步存储;你必须有一个本地同步缓存。
将blocked_sites
保存到变量,并在chrome.storage.onChanged
事件中更新它。这样,您将拥有该设置的同步缓存。
答案 1 :(得分:0)
通过您的代码结构化方式,您无法在回调后执行return { cancel: matched };
。原因是因为return { cancel: matched };
在一个执行帧中运行(与调用chrome.storage.local.get
相同),并且回调在未来的某个执行帧中运行。当你调用异步方法时,它只能将回调插入到事件循环中一段时间,到执行回调时return { cancel: matched };
已经执行了。