-
Notifications
You must be signed in to change notification settings - Fork 1
Lang Listeners
Небольшой набор функций для создания наблюдателей для различных событий.
create([list])
-
list
{(Function|Array)} - функция-обработчик события или список функций -
:return
{Function} - функция-слушатель
var f1 = function () {};
var f2 = function () {};
var f3 = function () {};
var listener = go.Lang.Listeners.create([f1, f2, f3]);
Теперь при вызове listener()
будут вызваны все связанные с ней обработчики.
При вызове с некоторым набором аргументов - все обработчики будут вызваны с теми же аргументами.
Получившаяся функция-слушатель имеет следующие методы: ping()
, append()
, remove()
.
listener.ping(); // алиас для listener()
var hid = listener.append(function () {/*...*/}); // добавить ещё один обработчик. Возвращается его идентификатор.
listener.remove(hid); // удалить один из обработчиков по его идентификатору.
listener.remove(f2); // удалить указанный обработчик.
append(func)
и remove(func)
по умолчанию не проверяют, сколько раз был установлен обработчик.
/* Установит один обработчик трижды: */
listener.append(func);
listener.append(func);
listener.append(func);
listener(); // трижды вызовется func
listener.remove(func); // удалит только первую найденную func()
listener(); // теперь func вызовется дважды
Чтобы проверяли, следует использовать второй аргумент у обоих методов:
var id1 = listener.append(func, true); // установит func
var id2 = listener.append(func, true); // второй раз не станет
id1 === id2; // Во второй раз вернётся тот же ID, что и в первый
listener.remove(func, true); // удалит все func, что найдёт
createCounter(count, listener)
-
count
(number) - значение счётчика -
listener
(function) - обработчик, который следует вызвать при обнулении счётчика -
:return
(function) - функция-счётчик
При каждом вызове получившейся функции, внутренний счётчик уменьшается. При достижении нуля, вызывается изначальный обработчик.
var counter = go.Lang.Listeners.createCounter(3, func);
counter();
counter();
counter(); // на 3-й раз вызовется func().
Есть некий список объектов:
var objs = [obj1, obj2, obj3, obj4, obj5];
В данный момент объекты загружают какое-то содержимое (например, это объекты IMG).
На каждый из объектов можно повесить обрабочик события onload
.
Нам нужно вызвать некую функцию в том момент, когда все объекты будут окончательно загружены.
var len = objs.length,
i,
counter = go.Lang.Listeners.createCounter(len, handler);
for (i = 0; i < len; i += 1) {
objs[i].onload = counter;
}
Счётчик внутри counter
изначально равен общему количеству объектов.
При загрузке очередного объекта вызывается counter
и счётчик уменьшается на единицу.
При загрузке последнего объекта, счётчик достигает нуля и вызывается handler()
.
При создании счётчика с count=0
, он срабатывает немедленно.
У функции-счётчика есть методы inc()
и filled()
.
inc()
увеличивает внутренний счётчик на значение своего аргумента (по умолчанию на единицу).
Например, у нас есть всё тот же список объектов с загружающимся содержимым.
Однако, часть объектов (а может быть и все) могли уже загрузить всё, что надо.
Так, что onload
у них больше не сработает.
И есть свойство loaded
по которому можно узнать, завершена ли загрузка.
Можно обойти весь список объектов и составить на его основе список тех, которые ещё не загружены.
Либо так:
var len = objs.length,
i,
counter = go.Lang.Listeners.createCounter(null, handler);
for (i = 0; i < len; i += 1) {
if (!objs[i].loaded) {
objs[i].onload = counter;
counter.inc();
}
}
counter.filled();
При указании в createCounter
null
(в отличии от 0
) мгновенного срабатывания не происходит.
Мы обходим все объекты и устанавливаем обработчик на те, что ещё не загружены, увеличивая вместе с этим счётчик.
На выходе счётчик соответствует количеству объектов, которых ещё ждём.
counter.filled()
указывает счётчику, что его наполнение закончено.
Если на данный момент он нулевой (все объекты были загружены), происходит срабатывание.
Замечание: счётчик срабатывает только один раз. После этого его нельзя будет увеличить с помощью inc()
и опять запустить.