Чем отличается browser.alarms.create от setTimeout / setInterval в WebExtensions? - PullRequest
0 голосов
/ 11 ноября 2018

Я создаю WebExtension для браузеров. Итак, я узнал о API browser.alarms . В основном это позволяет вам установить (повторяющийся или одноразовый) сигнал тревоги, и будет выполнен обратный вызов.

Теперь у нас уже давно есть такая возможность в JavaScript, как в setTimeout и setInterval. Так в чем разница с этими? Почему или в каких случаях я могу предпочесть одному другому ?

Я имею в виду, что основное различие очевидно: вы можете только подтвердить его, например. в минутах, а не секундах. Хотя я думаю, что с помощью when вы также можете отменить регистрацию и перерегистрировать ее с точностью до миллисекунды, но я думаю, что API может быть рассчитан на более длительные периоды, то есть минуты. (Я просто догадываюсь здесь.) Так почему я должен использовать его вместо простого обратного вызова setInterval / setTimeout?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018
  • Диапазон времени setTimeout / setInterval ограничен 2 ^ 31-1 = 2147483647, т.е. ~ 24 дня. Значения меньше 0 или больше, приведенные к диапазону int32, что может привести к неожиданным результатам.

  • setTimeout / setInterval является частью стандартного DOM, а не изолированного мира , поэтому, когда вы используете его внутри скрипта контента, скрипт веб-страницы может случайно удалить их через clearTimeout / clearInterval.
    Обходной путь: опубликовать сообщение в фоновом скрипте, чтобы он установил таймер и отправил ответ по окончании.

  • Страницы событий (те, которые имеют "persistent": false в manifest.json) не будут ждать setTimeout / setInterval перед выгрузкой из-за неактивности и не будут просыпаться для такого таймера, поэтому Вы можете использовать их только в течение очень короткого времени (в настоящее время страницы событий гарантированно живут в течение 5 секунд).

В указанных пределах вы можете безопасно использовать setTimeout / setInterval.

0 голосов
/ 11 ноября 2018

Цитировать из документации по MDN :

Это похоже на setTimeout () и setInterval (), за исключением того, что эти функции не работают с фоновыми страницами, которыезагружается по требованию.

...