Chrome Расширения: как настроить функцию для выполнения, когда день изменился - PullRequest
0 голосов
/ 08 марта 2020

В настоящее время с моим Chrome расширением я хочу выполнять блок кода всякий раз, когда для пользователя начинается новый день (у пользователей могут быть разные часовые пояса). Первоначально я смотрел на этот ответ , но, кажется, довольно устарел, и мне было любопытно использовать Chrome API, чтобы выручить меня.

Я изучал chrome .events и chrome .alarms, но было трудно прочитать и найти то, что я хотел.

На данный момент мой код выглядит следующим образом

background.js

const newDayExecute = () => {
// Code block to execute on a new day
}

setInterval(newDayExecute, 86400000 )  // execute block of code every 24 hours

1 Ответ

1 голос
/ 09 марта 2020

Использование setInterval() или setTimeout() не будет работать, если пользователь перезапустит браузер или расширение будет перезапущено по любой причине. То же самое относится и к chrome.alarms API.

Поскольку пользователь с большой вероятностью может запускать Chrome чаще, чем раз в день, я бы посоветовал вам сохранить метку времени в localStorage, а затем используйте функцию setInterval(), которая постоянно проверяет, была ли достигнута эта временная метка. Таким образом, даже если расширение или весь браузер перезапустится, вы все равно сможете определить, что прошел один день.

Примерно так:

function doSomething() {
    // Code that needs to run every day here
}

function tick() {
    // Re-calculate the timestamp for the next day
    let next = new Date();
    next.setDate(Date.now() + 1);

    // Adjust the timestamp if you want to run the code
    // always at the same time of the day (e.g. 10:00 am)
    next.setHours(10);
    next.setMinutes(0);
    next.setSeconds(0);
    next.setMilliseconds(0);

    // Save the new timestamp
    localStorage.savedTimestamp = next.getTime();

    // Run the function
    doSomething();
}

function checkTimestamp() {
    if (!localStorage.savedTimestamp)
        let timestamp = parseInt(localStorage.savedTimestamp);

        if (Date.now() >= timestamp)
            tick();
    } else {
        // First time running
        tick();
    }
}

// Check every minute
setInterval(checkTimestamp, 60000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...