Вопрос №55724 от пользователя Msh Ker в уроке «Обработка ошибок», курс «JS: Асинхронное программирование»

Msh Ker

Здравствуйте!

  1. Пытался учесть вот этот момент из задания: > Создаём новый файл и записываем туда данные исходного файла (это важно сделать до попытки удаления исходного файла!)

Если у нас имеется следующая функция: a(b(c))) и учитывая что стек у нас действует по принципу LIFO получается что при раскручивании функция "с" должна вызываться первой, так? и тогда если у нас "с" это функция fs.unlink то мы сперва удалим а потом попытаемся взять оттуда данные. Что я упускаю?

  1. Фрагмент из теории:

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

Не понял зачем "все равно" вызывать колбек и почему внешний код не дождется окончания операции.

  1. И ещё один вопрос по теории:

Последний вызов можно сократить. Если в самом конце не было ошибки, то вызов cb(error3) отработает так же, как и cb(null), а значит, весь код последнего колбека можно свести к вызову cb(error3):

откуда знать есть ли ошибка в "самом конце", то есть к cb(error3) можно сводить скрестив пальцы?

2 0

Александр Мандриков

Добрый день!

  1. Код на коллбеках выполняется строго после того, как завершилось предыдущее выполнение. Собственно это и обеспечивает вызов коллбека при окончании операции, например:
async1(arg1, (err1, data1) => {
  if (err1) {
    console.log(err1);
    return;
  }

  async2(arg2, (err2, data2) => {
    if (err2) return console.log(err2);

    console.log(data1 + data2);
  });
});

строка 1 - стартует асинхронная async1. После её выполнения (всё ещё 1я строка), мы получаем либо err1, либо data1. Только после этого мы переходим к условию на строке 2, если условие оказалось истинным и у нас есть ошибка - исполнение кода прерывается return'ом на 4й строке и до async2 дело не доходит. Если же ошибки нет, только в этом случае мы переходим к функции async2.

  1. Если не вызвать callback(null) в конце асинхронной операции, то при её успешном завершении вы не получите сообщение 'union was successful'. В данном случае сообщение потеряется, но это не так страшно, как например потерять файлы, которые вы подгружаете из интернета/диска. Последний коллбек позволит поднять данные наружу и использовать их дальше. ``` const callback = (err) => (err ? console.log(err) : console.log('union was successful')); unionFiles(path, callback);

// ============================

// создаём наш коллбек const dataCb = (err, data) => { if (err) { console.log(error); return; }

console.log(Data from my callback: ${data}); }

// асинхронные операции не используют инструкции return value, как синхронные функции // на себя этот функционал как раз забирает callback const getData = (path, dataCb) = { readFile(path, (err, data) => { if (err) return dataCb(err);

dataCb(null, data); // поднимаем данные наружу

}); };

3. Если в самом конце не было ошибки, то вызов `cb(error3)` отработает так же, как и `cb(null)`.

Сказано максимально понятно.
Если у вас ошибка в `error3` - то мы вызываем `cb(error3)`.
Если у вас нет ошибки в `error3`, то всё равно нужно вызвать коллбек (смотри пункт 2).
Тогда мы вызываем `cb(null)`. Но так как у нас нет ошибки в `error3`, то эта переменная равна `null`. Поэтому независимо от результата мы можем вызывать `cb(error3)`.
1

Maksim Litvinov

Добрый день! Помог ли вам ответ Александра разобраться с вопросами?

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
18 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
18 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
18 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
18 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
18 мая 5 месяцев