Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.01.2016, 19:04
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

Как бы вы переписали этот код
vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2016, 06:14
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2016, 07:09
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

В методе emit есть ошибка. Перед тем как пробегать по обработчикам и запускать их события надо сначала сделать копию массива обработчиков, в противном случае, если в одном из обработчиков будут добавляться/удаляться обработчики, то все может сломаться.
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2016, 07:12
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Ну и обычно делаю чтобы метод отписки мог работать и без параметров, в этом случае должны удаляться все обработчики. Очень удобно когда надо грохнуть целую вьюху со всеми обработчиками. Ну и очень круто сделали ребята в бэкбоне. Идея методов listenTo и stopListening - шикарна.
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2016, 07:17
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

https://github.com/tsigel/BaseClass/...er/src/Base.ts
Там есть поддержка событий через ":", и тестики.

Последний раз редактировалось tsigel, 29.01.2016 в 07:19.
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2016, 08:42
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #7 (permalink)  
Старый 29.01.2016, 08:51
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

GayCoder,
Допустим у меня есть 4 обработчика на 1 событии. Во втором обработчике я вешаю ещё 3 обработчика на это же событие. То есть массив по которому вы бежите изменится в момент выполнения одного из обработчиков. Как раз из-за того что js однопоточен, как вы верно заметили. Но если добавлять - то все хорошо, а если удалять - то всему конец.

Если я в обработчике отпишу следующий обработчик, то индекс собъется и пойдут трудно отлавливаемые баги.
Ответить с цитированием
  #8 (permalink)  
Старый 29.01.2016, 08:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от GayCoder Посмотреть сообщение
> a=[1,2,3,4,5]
[1, 2, 3, 4, 5]
> a.forEach((v, k) => { if (k == 2) a.splice(k, 1); console.log(v); })
1
2
3
5
undefined

Ну как бы даже чисто теоретически никто не может изменить массив пока выполняется цикл. JS то однопоточный.
Что то я не вижу у вас цифру 4
Ответить с цитированием
  #9 (permalink)  
Старый 29.01.2016, 09:02
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

var EventEmiter = {
    _handlers: [],
    on: function (handler) {
        this._handlers.push(handler);
    },
    off: function (handler) {
        this._handlers.splice(this._handlers.indexOf(handler), 1);
    },
    emit: function () {
        this._handlers.forEach(function (handler) {
            handler();
        });
    }
};

var handler4 = function () {
    console.log(4);
};

EventEmiter.on(function () {
    console.log(1);
});

EventEmiter.on(function () {
    console.log(2);
    EventEmiter.on(function () {
        console.log('Добавил в цикле, не долже проиграться во время текущего события!');
    });
});

EventEmiter.on(function () {
    console.log(3);
    EventEmiter.off(handler4);
});

EventEmiter.on(handler4);

EventEmiter.on(function () {
    console.log(5);
});

EventEmiter.on(function () {
    console.log(6);
});

EventEmiter.emit();


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

Обработчики события не должны влиять на работу ТЕКУЩЕГО события, они должны влиять на последующие за событием поведение.

Последний раз редактировалось tsigel, 29.01.2016 в 09:06.
Ответить с цитированием
  #10 (permalink)  
Старый 29.01.2016, 10:15
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста как мне можно изменить этот скрипт Niko Общие вопросы Javascript 3 15.04.2013 15:35
javascript обфускатор или как правильно скрыть код syegorius Общие вопросы Javascript 1 19.09.2012 02:58
Аккордеон меню, как доработать код. Gawk Общие вопросы Javascript 1 23.07.2012 13:01
Как вывести переменную из javascript в html код? red-nicolas Элементы интерфейса 3 25.02.2012 13:27
Как узнать динамический код страницы? gosha13 Общие вопросы Javascript 5 27.07.2009 13:31