Работа с фоновым таймером

Рейтинг: 1Ответов: 2Опубликовано: 17.04.2015

Имеем Google расширение которое должно периодически выводить информацию в виде Badge на иконке приложения. Пользователь должен иметь возможность менять интервал обновления.

Проблема в том что я не могу получить идентификатор запущенного таймера и соответственно не могу остановить таймер чтобы задать новый интервал. В файле options.js переменная _timerID - пуста! Я даже пробовал идентификатор таймера записывать в LocalStorage, но таймер не останавливается, видимо он существует в другом "пространстве"...

  • Вопрос №1, мне остановить таймер?
  • Вопрос №2, как делать подобные вещи наиболее правильно?

Вот файлы проекта:

В манифесте в качестве background используется background.html на котрой подключаются:

<script type="text/javascript" src="/js/main.js"></script>
<script type="text/javascript" src="/js/bg.js"></script>

На страничке options.html, которая отображает настройки подключаются:

<script type="text/javascript" src="/js/main.js"></script>
<script type="text/javascript" src="/js/options.js"></script>

bg.js

$(document).ready(function () {
  if (_enableTick)
    startTimer();
});

main.js

var _enableTick, _updateTime, _timerID;

function startTimer() {
  _timerID = window.setInterval(function() {
    setBadge(serverID);
  }, _updateTime));
}

options.js

function save_options() {
  clearInterval(_timerID);
}

Ответы

▲ 1Принят

Очень понравился вариант предложенный @SanSYS поэтому код преобразился в такой (Единственное что меня смущает, постоянное чтение параметров с storage..)

main.js

function startTimer() {
(function timer(){
  if (localStorage["setting:enableTick"]) {
    getServerInfo(function() {
      setBadge('bla-bla');
    });
  } else setBadge();
    clearTimeout(timer.id);
    var interval = parseInt(localStorage["setting:updateTime"]); 
    timer.id = setTimeout(timer, interval * 1000);
  })();
}

options.js

localStorage["setting:enableTick"] = $('#enableBadge').prop("checked");
localStorage["setting:updateTime"] = $('#timeUpdate').val();

startTimer();
▲ 2

Попробуйте либо создать объект, а внутри него уже сделать эти методы по запуску таймера и хранить ид таймера внутри объекта

либо вот такой изврат:

function startTimer() {
  startTimer._timerID = window.setInterval(function() {
    setBadge(serverID);
  }, _updateTime));
}

function save_options() {
  clearInterval(startTimer._timerID);
}

вы же помните, что функции такие же объекты?