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);

Как то так….