Как стать автором
Обновить

Комментарии 14

Если нажать две кнопки за один тик — змейка преждевременно умирает.
Пример — змейка движется направо, мы жмём вниз, и сразу же, быстро, влево. В итоге голова ударяется об «шею», хотя не сделала ни одного тика.
Судя по описанию шагов, думаю поток direction$ отправил именно последнее событие после тика (движение влево) и поскольку Вы двигались перед этим вправо — сработала проверка коллизий и она вернула true (голова решила вернуться и врезалась в тело)…
Да, но это ошибочное поведение.
А во что превратиться запуск scan() если мы уже сделали 100500 нажатий клавиш (играя минут 15, например)?
А что именно Вас смущает? Фактически оператор работает как reduce для массива (в статье об этом упоминалось)… И момент когда в оператор будет приходить новое значение — он будет хранить в себе лишь последнее значение (к примеру если говорить о потоке direction$ он будет хранить последнее изменение направления)… Таким образом если на 14:59 нажать влево, то scan() в себе будет хранить { x: -1, y: 0 }…
Я так понимаю, что буфер с данными всё время расти и каждый запуск scan() будет всё дольше и дольше.
он инициирует отправку каждого промежуточного результата.
Нет. Он не хранит в себе «все» данные всех потоков, а лишь «накопленный» результат… К примеру если функция вызывающаяся оператором scan() делает «X + 1» и первым значением туда прийдёт «1», то scan() будет хранить в себе «2». Что бы посмотреть что же в итоге там лежит можно просто вставить console.log(previous) в nextDirection…
Тоесть он не хранит массив всех поступиших в неё данных… Хотя это конечно зависит от реализации :)
Забавно, что в мире, где есть реализации змейки на JavaScript суммой меньше килобайта (включая HTML и CSS), люди пишут и такие реализации.
Идея этой статьи, и соответственно сама реализация Змейки, преследует лишь цель «объяснить доходчиво на простом примере» принцип подхода реативного программирования…
Вопрос: а зачем? Пример должен быть такой, чтобы показать реально выгоду, а не то, что можно простую задачу решить крайне сложным способом.
Как по мне, то это не плохой пример использования RxJS в игровом отрезке и для понимающих людей с потоками, местами, куда удобней работать чем с «простой реализацией простой задачи».
я так и воспринял эту статью. Но если человек никогда не читал исходные коды минималистичных змеек — такой подход может его напугать )

К чему было вводить behavioursubject? Ведь его можно было заменить еще одним scan

Я так понимаю, код этого фреймворка не особо совместим со старыми браузерами… Chrome 45, ничего не работает. Работает только в Firefox 47. Насчёт версий Хрома не исследовал, какая требуется минимальная… Но такие приложения много у кого не пойдут, и это не есть гуд
Зарегистрируйтесь на Хабре, чтобы оставить комментарий