【发布时间】:2019-06-01 16:15:55
【问题描述】:
我对 chrome 扩展安装/更新事件有疑问。如果我在后台脚本的顶级代码中添加 onInstalled 事件侦听器,我的事件侦听器是否会在某个时间范围内捕获该事件?
我问这个,因为我的演示表明,如果我在挂钩 onInstalled 侦听器之前执行了一些逻辑,它看起来永远不会被执行,就像同时发生的事件一样。
有人可以在后台脚本中的其他逻辑的上下文中更详细地向我解释这个事件是如何工作的,或者向我指出一些文档,因为我找不到任何有用的东西。
谢谢!
更新@Noam Hacker:由于公司政策,我不能在这里发布任何真实代码,但我有一些伪代码可以说明我的问题:
/**
* setup in which I miss onInstalled event
*/
function firstLogicThatRunsOnBackgroundLoad() {
// perform some logic
// perform some asynchronous operations via generators and promises
// which can take a while
chrome.runtime.onInstalled.addListener(function (details) {
if (details.reason == "install") {
// this logic never gets executed
} else if(details.reason == "update") {
// perform some logic
}
});
}
/**
* setup in which I catch onInstalled event
*/
function firstLogicThatRunsOnBackgroundLoad() {
chrome.runtime.onInstalled.addListener(function (details) {
if (details.reason == "install") {
// this logic executes
} else if(details.reason == "update") {
// perform some logic
}
});
// perform some logic
// perform some asynchronous operations via generators and promises
// which can take a while
}
【问题讨论】:
-
你有后台脚本的示例代码吗?
-
如果你把你的主要逻辑放在监听器函数里面呢?
chrome.runtime.onInstalled.addListener(function (details) { //perform logic you'd like to do first... //install/update logic... } -
@NoamHacker 如果我将一些我想首先执行的逻辑放在监听器函数中,我的测试表明,如果在监听器中还有其他一些逻辑,则不能保证这个逻辑会首先执行背景。
-
我看到你提到了异步生成器/承诺。您是否还执行
chrome.runtime.onInstalled.addListener(...)async,意思是在生成器/承诺或回调中?根据我的经验,当“顶级”后台脚本执行时,需要同步注册监听器。onInstalled回调执行当然是异步的,因为事件仅在初始同步脚本执行后触发。 -
@JoelPurra 你是对的,监听器需要在后台脚本的顶级代码中同步注册。自从我遇到这个问题以来已经有一段时间了,但问题是我在顶级代码之外添加了一些侦听器,这些侦听器是通过通过 Promise 编排的函数,这导致 onInstalled 事件在处理此事件的逻辑被挂钩之前执行。
标签: javascript google-chrome google-chrome-extension