Вопрос №55762 от пользователя Вячеслав Кузнецов в уроке «Параллельное выполнение операций», курс «JS: Асинхронное программирование»
Добрый день, немного запутался в синхронности/асинхронности...
Я же правильно понимаю, что по умолчанию все функции к js выполняются синхронно?
Вопрос этот пришел в голову, когда решая упражнения мы делаем обычный метод map, а потом async.map. JS ведь не пойдет дальше, пока не выполнится первый метод? А вот как раз метод async.map не остановит дальнейшее выполнения кода, и если дальше в коде будет что-то, что мы должны были получить через async.map, возникнет ошибка или undefined (что мы и лечим колбеками сейчас)?
Все так? Немного каша в голове :)
Спасибо
Добрый день!
Я же правильно понимаю, что по умолчанию все функции к js выполняются синхронно?
Не совсем так. Синхронные функции выполняются синхронно, асинхронные - асинхронно.
если дальше в коде будет что-то, что мы должны были получить через async.map, возникнет
ошибкаили undefined
Ошибка не возникнет, потому что асинхронная функция не подразумевает присваивания результата её выполнения в переменную, в текущем стеке вызовов вам не получить данные из асинхронной функции.
Данные будут получены уже после того, как выполнится весь код в файле (в большинстве случаев, зависит от "тяжести" кода и быстроты асинхронной операции). И эти данные как раз вернутся вам через коллбек.
Александр Мандриков,
Не совсем так. Синхронные функции выполняются синхронно, асинхронные - асинхронно.
А как мы можем понять, какой код в модуле выполняется синхронно, какой асинхронно? (например, если разбираем чужой код). Вариант только смотреть документацию? Я так понимаю, в основном все методы, функции, классы (по сути все, что мы ранее проходили) выполняется синхронно.
Ошибка не возникнет, потому что асинхронная функция не подразумевает присваивания результата её выполнения в переменную, в текущем стеке вызовов вам не получить данные из асинхронной функции.
Теоретически, если мы после асинхронной функции будем использовать переменную или константу, которую определяем в колбеке, то код выдаст ошибку reference error - is to defined
А как мы можем понять, какой код в модуле выполняется синхронно, какой асинхронно? (например, если разбираем чужой код)
Асинхронные функции на коллбеках не присваивают результат значений. Так же в глаза сразу бросается коллбек
fs.readFile(path, (err, data) => {...});
Есть промисы и их цепочки. Пропустить такой код тоже трудно:
fetch(url)
.then((response) => {...})
.catch((error) => {...});
Самый новый вариант с использованием async/await:
const getData = async (path) => {
const data = await fsPromises.readFile(path);
return data;
};
Синхронный же код выполняется последовательно, с присвоениями:
const value = 42;
const getSquareOfNumber = (x) => x ** 2;
const result = getSquareOfNumber(value);
if (result % 2) {
const binary= result.toString(2);
// ...
если мы после асинхронной функции будем использовать переменную или константу, которую определяем в колбеке, то код выдаст ошибку reference error
Если в этом смысле, то да. Такую ошибку довольно легко получить и без асинхронных функций. Достаточно обратиться к любой необъявленной переменной.
Вячеслав, помогли ли вам ответы Александра разобраться и разложить все в голове по полочкам?
Всем привет!
Решение не проходит последний тест, который называется "getDirectorySize4". Помогите, пожалуйста, разобраться.
Насколько я понимаю ошибка идет из 15 строки где вызывается колбек, только я не понимаю, что там не так...
Спасибо!
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







