on
lvl3
Проект №3 успешно завершен!
Тут я хочу написать свой отзыв о проекте и то чему я научился в нем.
Шаг 1 - сохраняем страницу
В целом достаточно простой шаг, но я неоправданно долго разбирался с тестами.
Загрузка данных осуществляется через цепочку Promises - я в них не особо “прочувствовал” асинхронность, для меня это было больше похоже просто на цепочку вызовов как при обработке коллекций:
load().then(content => save(content));
Неудобным мне показалось что если какой то промежуточный результат нужен не сразу, а где то дальше - нужно его либо тащить через всю цепочку или получить ещё раз когда он будет нужен.
Вот так делать не рекоммендуют (но мне хотелось):
load(host)
.then(content => saveToFile(content));
load(host)
.then(content => filter(content)
.then(filtered => saveToDb(filtered)));
Пример немного притянут за уши, но показывает что хотелось бы получить - я хочу по разному использовать результат выполнения функции load
.
(Как потом оказалось такой проблемы нет при использовании Async/Await)
Для того чтобы не делать реальные http-запросы при тестировании я познакомился с библиотекой для “мокинга запросов” - в целом ничего сложного если внимательно читать документацию, примеры достаточно наглядные.
Шаг 2 - загружаем ресурсы
Первое мое впечатление когда я прочитал задание - WTF??? Я не работал с JQuery, я же буду месяц его учить, но нагугли примеры я приблизительно понял как он работает, как искать теги и фильтровать их по аттрибутам этого было достаточно.
Проблемы подстерегали меня в неожиданных местах - генерации имен файлов - как всегда виной тому невнимательность.
На этот шаг было “убито” очень много времени
Шаг 3 - добавляем логгер
Наверное самый простой шаг в проекте, но дающий очень полезный механизм, отладки по логам. Так же не следует забывать что есть различные уровни логгирования что тоже может пригодится
Шаг 4 - обработка ошибок
Второй затык в проекте был связан с корректной обработкой ошибок, звучит все просто - получил ошибку - достал по коду ошибки сообщение для пользователя. Но нужно обязательно допройти курс по обработке ошибок - чувствую пробел в этой области.
Шаг 5 - отображаем прогресс
Прикрутили приятную библиотеку отображающую прогресс по загрузке файлов и прочих задача - если будет свободное время можно будет ещё куда-нибудь прикрутить asciinema
Шаг 6 (дополнительный) - меняем Promises на Async/Await
Async/Await позволяет практически спрятать асинхронную модель, код выглядит как обыкновенный - синхронный, результат можно переиспользовать, да и в целом переписывание не заняло много времени и думательных ресурсов :) Тесты тоже безболезненно переехали на async/await.
Ранее указанный пример с промисами
const content = await load(host);
await saveToFile(content);
const filtered = await filter(content);
await saveToDb(filtered);
Как то так….