正在同步执行异步函数

Executing asynchronous function , synchronously

本文关键字:异步 函数 执行 同步      更新时间:2023-09-26

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

您不能在webRequest阻塞侦听器中调用任何异步函数。没有办法绕过它,不管是愤怒还是其他。这从根本上是不可能的,因为JavaScript是单线程的;在当前函数执行完毕之前,异步操作甚至不会启动。

这意味着您不能依赖异步存储;你必须有一个本地同步缓存。

blocked_sites保存到一个变量中,并在chrome.storage.onChanged事件时对其进行更新。通过这种方式,您将获得该设置的同步缓存。

按照代码的结构方式,您将无法在回调后执行return { cancel: matched };。原因是return { cancel: matched };在一个执行帧中运行(与调用chrome.storage.local.get相同),回调在未来的某个执行帧内运行。当您调用异步方法时,它只能在将来的某个时间将回调插入事件循环中,在执行回调时,return { cancel: matched };已经执行。