gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:09:03 33 4
gpt4 key购买 nike

我正在开发 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 中的机会,并略微降低缓存中其他项目的机会(这可能隐含在增加中)。
  • 不要忘记在后台缓存更新中为不再可能出现的项目 trim 缓存
  • 尝试产生良好性能和合理内存使用的缓存大小。

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

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

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com