我对Chrome扩展安装/更新事件有疑问。如果我在后台脚本的顶级代码中添加onInstalled事件侦听器,那么我的事件侦听器是否会捕获该事件的时间范围?
我问这个,因为我的演示显示,如果我在挂钩onInstalled监听器之前有一些逻辑执行,看起来它永远不会被执行,就像那个事件同时发生一样。
有人可以向我解释这个事件的工作原理,在后台脚本中的其他逻辑的上下文中,或者指向一些文档,因为我找不到任何有用的东西。
谢谢!
更新@Noam黑客:由于公司政策,我不能在这里发布任何真实的代码,但我有一些伪代码来说明我的问题:
/**
* 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
}
答案 0 :(得分:4)
onInstalled
个侦听器在这些情况下捕获事件:
首次安装扩展程序时,扩展程序更新为新版本以及Chrome更新为新版本时。
由于这都是异步的,它将在后台发生,并且根据文档,在任何这些情况下立即触发。查看异步编程以获得一些清晰的信息。
根据您的问题,您似乎希望帮助以正确的顺序执行代码。 This answer为您的案例提供了一个有用的框架(使用reason
属性)。
chrome.runtime.onInstalled.addListener(function(details){
if(details.reason == "install"){
//call a function to handle a first install
}else if(details.reason == "update"){
//call a function to handle an update
}
});
答案 1 :(得分:4)
我也需要弄清楚这一点。虽然我没有找到任何权威的东西,但我确实在我的后台脚本中抛出了几个console.time()
语句。
代码是这样的:
console.time('onInstall event');
console.time('first function');
chrome.runtime.onInstalled.addListener(details => {
console.timeEnd('onInstall event');
});
// 7 module imports
someSyncFunction() // console.timeEnd('first function') is called in the first line in this function
然后我只是加载/重新加载扩展(解压缩,在开发模式下)几次。 onInstall
似乎在前50ms内非常可靠地触发,而第一个函数在第一个ms中发生。结果如下:
(First function, onInstall event)
(.282ms, 47.2ms)
(.331ms, 45.3ms)
(.327ms, 49.1ms)
(.294ms, 45.9ms)
答案 2 :(得分:0)
假设the document说
“侦听器必须从页面开始处同步注册。”
和
“请勿异步注册侦听器,因为它们不会被正确触发。”
,它似乎,它们确保每个同步连接的侦听器都不会丢失任何消息,无论评估代码需要花费多长时间。这可以通过在评估整个代码后 触发Chrome触发事件来完成。
我的假设是onInstalled
实际上像onInitialized
一样工作。不过没有测试数据。