Предотвращение одновременного запуска приемника событий JavaScript (в расширении Google Chrome) - PullRequest
2 голосов
/ 05 февраля 2011

Я установил расширение Google Chrome, которое создает контекстное меню закладок пользователя.Поскольку API ContextMenus должен быть реализован через фоновую страницу, я добавил следующие прослушиватели событий для обновления контекстного меню, если есть какие-либо изменения в закладках пользователя:

chrome.bookmarks.onChildrenReordered.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onMoved.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onCreated.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onRemoved.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onImportEnded.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

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

Может кто-нибудь предложить какие-либо предложения, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2011

Вы можете оставить глобальное логическое значение и обернуть им каждый из ваших обработчиков событий:

var lock = false;

chrome.bookmarks.onMoved.addListener(function () {
    if(!lock) {
        lock = true;
        chrome.contextMenus.removeAll();
        contextMenu();
        lock = false;
    }
});

делает то же самое для всех ваших обработчиков. Я не знаю, как обрабатываются потоки в Chrome, поэтому все еще существует вероятность прохождения несколькими потоками теста if перед выполнением первого назначения, особенно с многоядерными процессорами.

0 голосов
/ 05 февраля 2011

Я никогда раньше не работал с расширениями Chrome, но если вы когда-нибудь захотите предотвратить параллельные процессы, вы обычно можете сделать что-то вроде этого:

  1. имеет переменную с именем "lastEventTime "
  2. каждый раз, когда происходит событие, обновляйте переменную с текущей отметкой времени
  3. Каждый раз, когда происходит событие, проверьте, не истекло ли текущее время через 2 секунды после сохраненного времени.Если нет, то «return;».

Это должно гарантировать, что любые события, происходящие менее чем через две секунды после первого события, будут игнорироваться.

Я не уверен, решит ли это вашу проблему, но я надеюсь, что это направит вас в правильном направлении.

...