проблема обработки событий в chrome javascript - PullRequest
0 голосов
/ 10 апреля 2011

У меня проблема с несколькими обработчиками событий, вызываемыми одновременно в Google Chrome. Следующий код запускает функцию eventHandler в случае события создания закладки.

chrome.bookmarks.onCreated.addListener(eventHandler);

Когда создается несколько закладок, например, путем перетаскивания пары ссылок панели закладок из Firefox в Chrome, одновременно запускаются несколько функций eventHandler , что приводит к нежелательным эффектам. Мне нужно убедиться, что одновременно работает только один экземпляр eventHandler , а события обрабатываются в порядке поступления. Есть ли способ в javascript, чтобы убедиться в этом?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2011

Как отметил Якуб, асинхронная обработка событий является одним из приятных моментов JavaScript.Я бы посоветовал переосмыслить поток ваших приложений, а не пытаться его сериализовать.Более того, вам не обещают, что порядок, в котором происходят события, является порядком, в котором вы ожидаете, что они будут срабатывать.Перетаскивание в нескольких закладках может генерировать события в произвольном порядке.

Если вам действительно нужно убедиться, что ваша программа обрабатывает вещи в порядке их поступления и обрабатывает только один элемент за раз, вы можете разбить свою логику надве части: сама eventHandler может быть функцией, которая заполняет очередь событий, с которыми вам нужно каким-то образом иметь дело, и у вас может быть другая функция, которая выполняется в цикле, управляемом тайм-аутом, проверяя очередь, вытягивая элементи обрабатывать его.Что-то вроде следующего (непроверенного) кода:

function SerializedEventHandler() {
  chrome.bookmarks.onCreated.addListener(this.enqueue.bind(this));
}

SerializedEventHandler.prototype = {
  queue_: [],

  timer_: null,

  enqueue: function (e) {
    this.queue_.push(e);
    this.startProcessing();
  },

  startProcessing: function () {
    if (!this.timer_)
      this.timer_ = setTimeout(this.process.bind(this), 100);
  },

  process: function () {
    if (this.queue_.length) {
      var item = this.queue_.shift();
      // do something with `item`
      this.timer_ = clearTimeout(this.timer_);
      this.startProcessing();
    }
  }
};

Имеет ли это смысл?

0 голосов
/ 10 апреля 2011

Я не думаю, что есть действительно элегантный способ сделать это. Весь смысл JavaScript в том, что он основан на событиях.

Можно взломать его, используя setTimeout с очень коротким таймаутом.

var timeout;

chrome.bookmarks.onCreated.addListener(function(ev) {
  clearTimeout(timeout);
  timeout = setTimeout(function() {eventHandler(ev);}, 5);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...