Как отметил Якуб, асинхронная обработка событий является одним из приятных моментов 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();
}
}
};
Имеет ли это смысл?