Обещания, колбеки и события (Node.js/JS)
Встроенные promises в js — вещь безусловно полезная, но по моим наблюдениям, в среде новичков вызвала мнение что это некая штуковина, позволяющая писать код вообще без колбеков, лапшы и событий. Если честно, я тоже сначала поддался этому мнению, но увы, таких штуковин с Хогвартса еще не завозили.
Разберем каждый прием кратко.
Колбеки.
JS позволяет сохранить функцию в переменную, что в свою очередь позволяет передавать одну функцию внутрь другой и там использовать ее.
Это удобно когда надо создавать цепочки вызова, вот например фреймворк Express имеет функцию app.use( callback); тут для колбека самое место.
Минус колбеков — печально известная лапша. Действительно, она обычно возникает при неверном использовании колбеков, но обещания ни каким образом не сжимают размер кривого кода, ведь обещания тоже используют колбеки, сами смотрите
*.then( callback);Вместо этого обещания позволяют изменить логику приложения так, чтоб такой сильной вложенности просто не было, без прибегания к дополнительным библиотекам, как это было ранее.
События
События пожалуй вызывают наибольший дисонанс у jQuery разработчика, ведь в основном тут уровень работы с событиями ограничен $(...).click() и подобными. События очень похожи на обещания, сознаюсь я больше работаю с Node.js с его достаточно прозрачным EE, и поначалу у меня даже вызвал гнев этот «нафиг нужный promineses!» и я был не прав, тогда я еще просто не понимал две очень существенные разницы между событиями и обещаниями, как и колбеки, они просто созданы для разных вещей.Например, база данных. Мы знаем — JS асинхронен, потому перед отправкой запроса, мы должны дождаться установки конекта с бд. Можно прибегнуть к событию и сказать кешируй запросы, а когда конект будет установлен, отправь их все в бд, вроде верно но нет.
Что если коннект с базой данных успел установится до того как загрузился модуль кеша? Тогда модуль кеша так и будет ждать события коннект, а его не будет, потому что оно уже было а наш модуль его пропустил.
Тут нужны обещания, в отличие от событий, они сработают не только на текущие события, но и на те что уже были. Однако обещание выполняется только один раз, а событие сколько угодно раз.
Например модуль профиля генерирует события изменения различных полей, любой другой модуль удобно повесит на эти события обработчик. Так например модуль чата, может менять ваше имя в переписке, при каждой смене имени в профиле. Тут обещания только помешают, ведь мне надо чтобы на эти события была постоянная реакция и мне не надо реагировать на смены имени до загрузки модуля чата.
Подытожим
Колбеки
+ идеальны для создания цепочек вызова— при чрезмерном увлечении, опасность создать лапшу
События
+ идеальны для оповещения о текущих событиях.— не хранят данных о уже прошедших событиях
Обещания
+ идеальны для ожидания завершения каких либо функций.— не умеют срабатывать дважды, не умеют срабатывать только на текущие события, не срабатывая на уже прошедшие.
И помните, ничто в программировании не статично, возможно Хогвардс таки сумеет создать ту волшебную кнопку, что делает все хорошо, а пока учиться и еще раз учиться.
42 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів