阻塞 chrome.webRequest.onBeforeSendHeaders 侦听器中的异步操作
Asynchronous operation in blocking chrome.webRequest.onBeforeSendHeaders listener
我正在开发 Chrome 扩展,运行 由于针对同步和异步 API 的混合开发而遇到问题。
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
//code that modifies details.requestHeaders
//..
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]
在侦听器函数中,我想从 IndexedDB 获取数据并根据此数据修改请求 headers。 IndexedDB只有一个异步API,而监听器的契约要求它是同步的。
有什么办法可以解决这个问题吗?
数据库调用通常过于昂贵。也就是说,这是我脑海中浮现的一个想法(这可能很糟糕):
- 在内存中保留最常用数据的缓存。使用某种类型的简单数据结构,例如 Map.
- 在应用程序加载最有可能需要的任何数据时预填充地图。在加载扩展背景页面时执行此操作。
- 在适当的运行时生命周期内定期更新缓存的内容。从应用程序的后台页面执行此操作,使用警报触发计划更新。在后台页面 load/app 启动时注册警报。
- 查询onBeforeSendHeaders中的内存映射。地图查找是同步且快速的。如果查找有效,那就太好了。如果失败了,想一个错误处理机制(如果你称之为错误)。
- 当发生缓存未命中时,触发异步调用(您无需等待解决)最终将缓存未命中记录到另一个数据结构。您用于定期更新地图的代码的相同其他结构。
- 当发生缓存命中时,触发一个异步调用,增加该值保留在地图中的机会,并略微降低缓存中其他项目的机会(也许这隐含在增加中)。
- 不要忘记在后台缓存更新中为不再可能出现的项目修剪缓存
- 试验产生良好性能和合理内存使用的缓存大小。
也就是说,您需要考虑缓存未命中时的用户体验。也许提供一个默认参数,或某种占位符值,以某种方式通知用户未命中。这在某种程度上取决于您希望应用程序如何工作以及应用程序的作用,您没有说明。
哦,笨蛋,考虑使用 localStorage 作为内存映射...呃。
我正在开发 Chrome 扩展,运行 由于针对同步和异步 API 的混合开发而遇到问题。
chrome.webRequest.onBeforeSendHeaders.addListener(function(details) {
//code that modifies details.requestHeaders
//..
return {requestHeaders: details.requestHeaders};
},
{urls: ["<all_urls>"]},
["blocking", "requestHeaders"]
在侦听器函数中,我想从 IndexedDB 获取数据并根据此数据修改请求 headers。 IndexedDB只有一个异步API,而监听器的契约要求它是同步的。
有什么办法可以解决这个问题吗?
数据库调用通常过于昂贵。也就是说,这是我脑海中浮现的一个想法(这可能很糟糕):
- 在内存中保留最常用数据的缓存。使用某种类型的简单数据结构,例如 Map.
- 在应用程序加载最有可能需要的任何数据时预填充地图。在加载扩展背景页面时执行此操作。
- 在适当的运行时生命周期内定期更新缓存的内容。从应用程序的后台页面执行此操作,使用警报触发计划更新。在后台页面 load/app 启动时注册警报。
- 查询onBeforeSendHeaders中的内存映射。地图查找是同步且快速的。如果查找有效,那就太好了。如果失败了,想一个错误处理机制(如果你称之为错误)。
- 当发生缓存未命中时,触发异步调用(您无需等待解决)最终将缓存未命中记录到另一个数据结构。您用于定期更新地图的代码的相同其他结构。
- 当发生缓存命中时,触发一个异步调用,增加该值保留在地图中的机会,并略微降低缓存中其他项目的机会(也许这隐含在增加中)。
- 不要忘记在后台缓存更新中为不再可能出现的项目修剪缓存
- 试验产生良好性能和合理内存使用的缓存大小。
也就是说,您需要考虑缓存未命中时的用户体验。也许提供一个默认参数,或某种占位符值,以某种方式通知用户未命中。这在某种程度上取决于您希望应用程序如何工作以及应用程序的作用,您没有说明。
哦,笨蛋,考虑使用 localStorage 作为内存映射...呃。