在时间用完后重新打开Chrome时,Chrome扩展程序警报会消失吗?

use*_*122 4 javascript google-chrome javascript-events alarm google-chrome-extension

使用Google Chrome扩展程序警报时,如果已设置并且Chrome已关闭并在警报到期后重新打开,则警报将会关闭.

我怎么能阻止这个?

这是一个小代码示例来解释我的意思.

/* 
If we perform Browser Action to create alarm, then 
close the browser, wait about 2 minutes for the alarm to expire
and then reopen the browser, the alarm will go off and the DoSomething 
function will get called twice, once by the onStartup event and once
by the onAlarm event.
*/
chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.alarms.create('myAlarm', {
        delayInMinutes : 2.0
    });
});

chrome.alarms.onAlarm.addListener(function (alarm) {
    console.log('Fired alarm!');
    if (alarm.name == 'myAlarm') {
        createListener();
    }
});

chrome.runtime.onStartup.addListener(function () {
    console.log('Extension started up...');
    DoSomething();
});

function DoSomething() {
    alert('Function executed!');
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您将阅读我的代码示例顶部的注释,您将看到会发生什么.

我想要的是,如果浏览器关闭,警报将被清除,因为我希望DoSomething函数仅在浏览器刚刚启动时由onStartup事件执行,并让警报仅在浏览器之后执行DoSomething函数启动,我的代码创建一个新的警报.

浏览器关闭后,我绝不希望警报停留,然后在重新打开浏览器时执行onAlarm.

怎么能实现这个?

Rob*_*b W 5

Chrome扩展程序无法在浏览器关闭时可靠地运行某些代码.

不要在关机时清理,只需确保在启动时不运行旧警报.这可以通过生成唯一(到会话)标识符来实现.

如果您正在使用事件页面,请将标识符存储在chrome.storage.local(不要忘记storage在清单文件中设置权限).否则,将其存储在全局范围内.

// ID generation:
chrome.runtime.onStartup.addListener(function () {
    console.log('Extension started up...');
    chrome.storage.local.set({
        alarm_suffix: Date.now()
    }, function() {
        // Initialize your extension, e.g. create browser action handler
        // and bind alarm listener
        doSomething();
    });
});

// Alarm setter:
chrome.storage.local.get('alarm_suffix', function(items) {
    chrome.alarms.create('myAlarm' + items.alarm_suffix, {
        delayInMinutes : 2.0
    });
});

// Bind alarm listener. Note: this must happen *after* the unique ID has been set
chrome.alarms.onAlarm.addListener(function(alarm) {
    var parsedName = alarm.name.match(/^([\S\s]*?)(\d+)$/);
    if (parsedName) {
        alarm.name = parsedName[0];
        alarm.suffix = +parsedName[1];
    }
    if (alarm.name == 'myAlarm') {
        chrome.storage.local.get('alarm_suffix', function(data) {
            if (data.alarm_suffix === alarm.suffix) {
                doSomething();
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您使用事件页面,而是使用普通的后台页面,则只需全局存储该变量(优点:id读/写变为同步,这需要更少的代码):

chrome.runtime.onStartup.addListener(function () {
    window.alarm_suffix = Date.now();
});
chrome.alarms.create('myAlarm' + window.alarm_suffix, {
    delayInMinutes : 2.0
});
chrome.alarms.onAlarm.addListener(function(alarm) {
    var parsedName = alarm.name.match(/^([\S\s]*?)(\d+)$/);
    if (parsedName) {
        alarm.name = parsedName[0];
        alarm.suffix = +parsedName[1];
    }
    if (alarm.name == 'myAlarm') {
        if (alarm.suffix === window.alarm_suffix) {
            doSomething();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

或者只是使用旧的setTimeout来实现相同的目标而没有副作用.

setTimeout(function() {
    doSomething();
}, 2*60*1000); // 2 minutes
Run Code Online (Sandbox Code Playgroud)