同步执行异步功能

时间:2015-11-12 21:17:02

标签: javascript google-chrome-extension

我正在制作一个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);

2 个答案:

答案 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 };已经执行了。