Swe*_*per 6 javascript google-chrome-extension
在我的 chrome 扩展中,我有一个后台脚本,它将使用XMLHttpRequest.
// note that this code is in the global scope i.e. outside of any function
// also note that I got this code from the page talking about XMLHttpRequest
var myData = [];
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handleStateChange;
xhr.open("GET", "...", true);
xhr.send();
function handleStateChange() {
myData = Object.values(JSON.parse(xhr.responseText));
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么时候xor.send()运行。
我观察到每次我通过按
按钮,xhr.send()将被调用。我还观察到打开新选项卡/窗口不会导致后台脚本再次运行。
我还发现这个页面,后台页面被“加载”和“卸载”,但它几乎没有说明后台脚本全局范围内的代码何时运行。
它是否仅在安装/重新加载扩展时运行?
由于对于所有用户的选项卡和窗口(响应所有每个选项卡的资源),全局仅存在一个扩展程序后台页面的副本,如果它从未被暂停,您将永远不会看到启动过程(浏览器重新启动和更新期间除外) . 您可以启动任务管理器并查看扩展程序的背景是否始终存在并保持不变,Process ID表明它没有被关闭。还有一个可选Keepalive count列,显示有多少活动使流程处于活动状态,带有 a 的任务-可能被强制持久化,但–似乎由于多种原因而发生。
如果后台页面具有persistent:false并满足关闭它的所有其他条件,则可以关闭它,直到发生下一个事件(侦听器getBackgroundPage()、 等)。下一个需要它的事件将加载执行全局范围等的后台页面,作为设置预期被调用的侦听器的一部分。
你可以去chrome://extensions让开发人员模式,然后检查扩展的背景页面视图persistent和permissions: [chrome.webRequest]他们的干扰:
如果您仍然在persistent:true没有明确设置的情况下获得行为,那么它可能是由后台页面全局范围内的状态引起的。最好仍然遵循迁移指南,例如,如果您想在挂起后从第一次启动时保留数据,则您的 xhr 请求属于启动:
chrome.runtime.onStartup.addListener(function() {
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = handleStateChange
xhr.open("GET", "...", true)
xhr.send()
function handleStateChange() {
chrome.storage.local.set({ myData:
JSON.stringify(Object.values(JSON.parse(xhr.responseText)))});
}
})
Run Code Online (Sandbox Code Playgroud)
这应该具有在全局范围内运行此代码的大致等效行为persistent:true,但是 xhr 可以被垃圾收集,因为这不是其他侦听器等的范围(因为 chrome 将网络套接字等资源类型标记为无法挂起的原因,将它们移出范围很重要。)适应后,即使浏览器仍未自动暂停它,您也可以通过在后台页面检查中重新加载扩展程序来测试行为。
如果您不想适应persistent:false,那么我会persistent:true在清单中进行设置,而不是依赖当前的隐式行为。(即使您无法在测试系统上导致挂起,如果您设置了 ,则具有更多内存压力或某些其他条件的系统可能会卸载您的后台页面persistent:false。)
如果您发现情况Process ID正在发生变化,但您没有遇到任何问题,那么您就有点幸运了。系统确保您的全局作用域在它为您重新启动传入请求的后台页面时运行,但它不确保任何异步部分已完成。例如,如果它需要启动您的后台页面以查看您是否有合适的侦听器,则它必须启动 ajax,但允许在全局范围的同步部分完成运行时调用该侦听器,这可能在响应之前. 因此,您不能指望MyDatasuspend 是否正常工作。
如果您希望将 xhr 请求保留在全局范围内并正确支持persistent:false,则需要确保侦听器立即注册但在内部等待myData。例如,如果myDataPromise 已handleStateChange()解析,则其他侦听器可以使用myData.then(..)后台页面最近重新启动时的 ajax 响应来提供异步响应,而不是自 ~installation 以来存储在 chrome 本地存储中。
| 归档时间: |
|
| 查看次数: |
1132 次 |
| 最近记录: |