阻止chrome.webRequest.onBeforeSendHeaders监听器的异步操作

时间:2015-03-19 18:18:44

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

我正在开发Chrome扩展程序,并且由于针对同步和异步apis的混合而开发而遇到了一个问题。

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

在侦听器函数内部,我想从IndexedDB获取数据,并根据此数据修改请求标头。 IndexedDB只有一个异步API,而侦听器的契约要求它是同步的。

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

1 个答案:

答案 0 :(得分:4)

数据库通话过于昂贵。也就是说,这是我头脑中的一个想法(这可能是可怕的):

  • 保留最常用数据的内存缓存。使用某种类型的简单数据结构,如Map
  • 当应用加载最可能需要的任何数据时,预先填充地图。加载扩展背景页面时执行此操作。
  • 在适当的运行时生命周期内定期更新缓存的内容。从应用程序的后台页面执行此操作,使用警报触发计划更新。在后台页面加载/应用启动时注册闹钟。
  • 在onBeforeSendHeaders中查询内存映射。地图查找是同步且快速的。如果查找有效,那很好。如果失败,请考虑错误处理机制(如果将此称为错误)。
  • 当发生缓存未命中时,触发异步调用(您不需要等待解析),最终将缓存未命中记录到另一个数据结构。您用于定期更新地图的代码的相同其他结构。
  • 当发生缓存命中时,触发异步调用以增加值在映射中保留的可能性,并略微降低缓存中其他项的可能性(可能隐含在增加中)。
  • 不要忘记在后台缓存更新中修剪不再可能的项目的缓存
  • 尝试使用可以提供良好性能和合理内存使用的缓存大小。

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

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