Вопрос

У меня есть дополнение, которое каждые 5 минут или около того проверяет RSS-канал на наличие нового сообщения, и если оно есть, оно отображает предупреждение().Проблема в том, что я боюсь, что если пользователь откроет несколько окон, то при появлении нового сообщения появятся миллионы предупреждений, говорящих одно и то же.Можно ли вообще одновременно работать только один «мозг»?

Заранее спасибо!

Это было полезно?

Решение

Найдите что-то под названием «Модули общего кода Javascript» или JSM.

Основные документы здесь:

https://developer.mozilla.org/En/Using_JavaScript_code_modules

Каждый файл .js в вашем аддоне, которому требуется общая память, откроется со следующей строкой:

Components.utils.import("resource://xxxxxxxx/modules/[yourFilenameHere].jsm", com.myFirefoxAddon.shared);

Приведенная выше строка открывает [yourFilenameHere].jsm и загружает его. экспортировано (см. ниже) функции и переменные в объект com.myFirefoxAddon.shared.Каждый загруженный экземпляр этого объекта будет указывать на один и тот же экземпляр в памяти.

Обратите внимание: если вы хотите иметь хоть какую-то надежду на то, что ваш аддон пройдет модерацию, вам нужно будет написать весь свой код в объекте типа com.myFirefoxAddon.*, поскольку головорезы из AMO не допускают одобрения аддонов, которые не проходят модерацию. Уважайте глобальное пространство имен

Самый большой недостаток JSM заключается в том, что вам нужно вручную экспортировать каждую функцию, которую вы хотите сделать доступной для остальной части вашего кода...поскольку JS не поддерживает публичные/частные типы, это кажется мне своего рода «публичной» поддержкой бедняков...в любом случае вам нужно будет создать массив EXPORTED_SYMBOLS где-нибудь в вашем файле JSM и указать каждую функцию или объект, который вы хотите экспортировать, например:

var EXPORTED_SYMBOLS = [
    /* CONSTANTS */
    "SERVER_DEBUG",
    "SERVER_RELEASE",

    "LIST_COUNTRIES",
    "LIST_TERRITORIES_NOEX",

    /* GLOBAL VARIABLES */
    /* note: primitive type variables need to be stored in the globals object */
    "urlTable",
    "globals",

    /* INTERFACES */
    "iStrSet",

    /* FUNCTIONS */
    "globalStartup",

    /* OBJECTS */
    "thinger",
    "myObject"

]

Другие советы

[отредактировано] Модули не являются правильным решением этой проблемы, поскольку код по-прежнему будет импортироваться в каждое окно, и любые настроенные вами прослушиватели/таймеры будут запускаться в каждом окне. Вы должны быть осторожны с использованием модулей для этого - все таймеры/обратные вызовы должны быть настроены в коде модуля (а не только с использованием объекта-наблюдателя, определенного в модуле), и вы не должны использовать какие-либо ссылки на окно в модуле. .

Правильный способ сделать это я бы предпочел написать компонент XPCOM (на JS).Да, это несколько сложно, и у меня нет удобной ссылки, объясняющей, как это сделать.Одна вещь:реализовать его с помощью XPCOMUtils проще, старая документация будет содержать много шаблонного кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top