Вопрос №55724 от пользователя Msh Ker в уроке «Обработка ошибок», курс «JS: Асинхронное программирование»
Здравствуйте!
- Пытался учесть вот этот момент из задания: > Создаём новый файл и записываем туда данные исходного файла (это важно сделать до попытки удаления исходного файла!)
Если у нас имеется следующая функция:
a(b(c)))
и учитывая что стек у нас действует по принципу LIFO получается что при раскручивании функция "с" должна вызываться первой, так? и тогда если у нас "с" это функция fs.unlink то мы сперва удалим а потом попытаемся взять оттуда данные. Что я упускаю?
- Фрагмент из теории:
Если ошибка не возникла, то мы всё равно вызываем исходный колбек и передаём туда null. Вызывать его обязательно, иначе внешний код не дождётся окончания операции.
Не понял зачем "все равно" вызывать колбек и почему внешний код не дождется окончания операции.
- И ещё один вопрос по теории:
Последний вызов можно сократить. Если в самом конце не было ошибки, то вызов cb(error3) отработает так же, как и cb(null), а значит, весь код последнего колбека можно свести к вызову cb(error3):
откуда знать есть ли ошибка в "самом конце", то есть к cb(error3) можно сводить скрестив пальцы?
Добрый день!
- Код на коллбеках выполняется строго после того, как завершилось предыдущее выполнение. Собственно это и обеспечивает вызов коллбека при окончании операции, например:
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
.
- Если не вызвать
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)`.
Добрый день! Помог ли вам ответ Александра разобраться с вопросами?
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







