Как спать в расширении Firefox без использования setTimeout?

Я пытаюсь открыть всплывающее окно, подождать X секунд, а затем закрыть всплывающее окно.

(Вариант использования - отправка уведомления в веб-приложение, но мы не можем просто выполнить запрос GET, так как он должен быть в том же сеансе, чтобы мы могли использовать сеанс входа в систему)

Я не могу использовать setTimeout как мы не можем использовать его в дополнениях / расширениях

Как я могу получить аналогичную функциональность, не прибегая к жеванию циклов процессора, что, очевидно, вызывает заметную задержку?

2 ответа

Решение

Вы можете использовать nsITimer.

Ниже приведен базовый пример, но вы можете найти дополнительную информацию (включая использование Components.interfaces.nsITimer.TYPE_REPEATING_SLACK в качестве альтернативы setInterval) на соответствующей странице документации по адресу https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsITimer

// we need an nsITimerCallback compatible interface for the callbacks.
var event = {
  notify: function(timer) {
    alert("Fire!");
  }
}

// Create the timer...  
var timer = Components.classes["@mozilla.org/timer;1"]
    .createInstance(Components.interfaces.nsITimer);

// initialize it to call event.notify() once after exactly ten seconds. 
timer.initWithCallback(event,10000, Components.interfaces.nsITimer.TYPE_ONE_SHOT);

Вы можете использовать модуль таймеров, предоставляемый SDK вместо nsITimer для того же вида функций setTimeout/setInterval, предоставляемых в браузерах

let { setTimeout } = require('sdk/timers');

function openPopup () {}

setTimeout(openPopup, 3000);
Другие вопросы по тегам