正在同步执行异步函数
Executing asynchronous function , synchronously
我正在制作一个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 };
已经执行。
相关文章:
- 如何在异步函数中使用javascript对象
- Meteor:异步函数回调异常:onAfterAction
- 未调用jquery异步函数
- 使用来自不同异步函数的响应创建一个json对象
- 如何在异步函数中正确使用Promise.all()和then()
- 从异步函数返回值
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 如何在将Node异步函数转换为promise时使用Q库
- 如何在异步函数与Deferredjquery之间同步
- ng用异步函数模拟怪异行为
- 用mocha测试异步函数
- 用于异步函数中的循环和定时问题
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 嵌套异步函数未及时返回数据的问题
- 在异步函数中维护变量的状态
- 递归异步函数
- Bluebird promisifyAll不会创建整个异步函数集
- 递归调用异步函数
- 异步函数调用是否可以在两个同步语句之间完成
- 如何在nodejs中实现异步函数