chrome扩展onInstalled事件

时间:2016-11-15 15:04:44

标签: javascript google-chrome google-chrome-extension

我对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
}

3 个答案:

答案 0 :(得分:4)

onInstalled个侦听器在这些情况下捕获事件:

  

首次安装扩展程序时,扩展程序更新为新版本以及Chrome更新为新版本时。

由于这都是异步的,它将在后台发生,并且根据文档,在任何这些情况下立即触发。查看异步编程以获得一些清晰的信息。

link to documentation

根据您的问题,您似乎希望帮助以正确的顺序执行代码。 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一样工作。不过没有测试数据。