javascript - 阻塞 chrome.webRequest.onBeforeSendHeaders 监听器中的异步操作

标签 javascript google-chrome asynchronous google-chrome-extension indexeddb

我正在开发一个 Chrome 扩展程序,由于混合使用同步和异步 API 进行开发,遇到了问题。

chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
  //code that modifies details.requestHeaders
  //..
  return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]

在监听器函数内,我想从 IndexedDB 获取数据并根据该数据修改请求 header 。 IndexedDB 只有异步 API,而监听器的契约要求它是同步的。

有什么想法可以解决这个问题吗?

最佳答案

数据库调用通常成本太高。也就是说,这是我突然想到的一个想法(这可能很可怕):

  • 在内存中保留最常用数据的缓存。使用某种类型的简单数据结构,例如 Map .
  • 当应用加载最可能需要的任何数据时,预先填充 map 。在加载扩展程序后台页面时执行此操作。
  • 在运行时生命周期内适当时定期更新缓存的内容。从应用程序的后台页面执行此操作,使用警报按计划触发更新。在后台页面加载/应用程序启动时注册警报。
  • 在onBeforeSendHeaders中查询内存映射。 map 查找是同步且快速的。如果查找有效,那就太好了。如果失败,请考虑一种错误处理机制(如果您称其为错误)。
  • 当发生缓存未命中时,触发异步调用(您无需等待解决),最终将缓存未命中记录到另一个数据结构。与您用于定期更新 map 的代码的其他结构相同。
  • 当发生缓存命中时,触发异步调用,以增加该值保留在 map 中的机会,并稍微减少缓存中其他项目的机会(也许这在增加中是隐含的)。
  • 不要忘记在后台缓存更新中删除不再可能出现的项目的缓存
  • 试验缓存大小,以产生良好的性能和合理的内存使用率。

话虽如此,您需要考虑缓存未命中时的用户体验。也许提供一个默认参数,或者某种占位符值,以某种方式通知用户未命中。这在某种程度上取决于您希望应用程序如何工作以及应用程序做什么,但您没有说明。

哦,derp,考虑使用 localStorage 作为内存映射......呃。

关于javascript - 阻塞 chrome.webRequest.onBeforeSendHeaders 监听器中的异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29152166/

相关文章:

css - 为触摸屏信息亭隐藏 chrome 中的光标

javascript确认对话框问题

Javascript 异步请求不起作用

ios - swift 。在后台运行异步下载并让用户与 UI 交互

javascript - 如何将 key 添加到添加到 Angularfire 2 版本 5 中节点的对象

javascript - 如何在javascript中推送多维数组

javascript - 为什么 angular.bind() 存在而核心 javascript 具有相同的功能?

javascript - 加载弹出 javascript

google-chrome - 如何检测 Chrome/Safari/Firefox 是否阻止了视频的自动播放?

c# - 通过计时器以 xamarin 形式重复异步任务