Вопрос №55762 от пользователя Вячеслав Кузнецов в уроке «Параллельное выполнение операций», курс «JS: Асинхронное программирование»

Вячеслав Кузнецов

Добрый день, немного запутался в синхронности/асинхронности...

Я же правильно понимаю, что по умолчанию все функции к js выполняются синхронно?

Вопрос этот пришел в голову, когда решая упражнения мы делаем обычный метод map, а потом async.map. JS ведь не пойдет дальше, пока не выполнится первый метод? А вот как раз метод async.map не остановит дальнейшее выполнения кода, и если дальше в коде будет что-то, что мы должны были получить через async.map, возникнет ошибка или undefined (что мы и лечим колбеками сейчас)?

Все так? Немного каша в голове :)

Спасибо

6 0

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

Добрый день!

Я же правильно понимаю, что по умолчанию все функции к js выполняются синхронно?

Не совсем так. Синхронные функции выполняются синхронно, асинхронные - асинхронно.

если дальше в коде будет что-то, что мы должны были получить через async.map, возникнет ошибка или undefined

Ошибка не возникнет, потому что асинхронная функция не подразумевает присваивания результата её выполнения в переменную, в текущем стеке вызовов вам не получить данные из асинхронной функции.

Данные будут получены уже после того, как выполнится весь код в файле (в большинстве случаев, зависит от "тяжести" кода и быстроты асинхронной операции). И эти данные как раз вернутся вам через коллбек.

0

Вячеслав Кузнецов

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

Не совсем так. Синхронные функции выполняются синхронно, асинхронные - асинхронно.

А как мы можем понять, какой код в модуле выполняется синхронно, какой асинхронно? (например, если разбираем чужой код). Вариант только смотреть документацию? Я так понимаю, в основном все методы, функции, классы (по сути все, что мы ранее проходили) выполняется синхронно.

Ошибка не возникнет, потому что асинхронная функция не подразумевает присваивания результата её выполнения в переменную, в текущем стеке вызовов вам не получить данные из асинхронной функции.

Теоретически, если мы после асинхронной функции будем использовать переменную или константу, которую определяем в колбеке, то код выдаст ошибку reference error - is to defined

0

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

А как мы можем понять, какой код в модуле выполняется синхронно, какой асинхронно? (например, если разбираем чужой код)

Асинхронные функции на коллбеках не присваивают результат значений. Так же в глаза сразу бросается коллбек

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

Если в этом смысле, то да. Такую ошибку довольно легко получить и без асинхронных функций. Достаточно обратиться к любой необъявленной переменной.

0

Maksim Litvinov

Вячеслав, помогли ли вам ответы Александра разобраться и разложить все в голове по полочкам?

0

Вячеслав Кузнецов

Александр Мандриков, Спасибо за подробные разъяснения!

Максим, да, конечно

0

Olga

Всем привет!

Решение не проходит последний тест, который называется "getDirectorySize4". Помогите, пожалуйста, разобраться.

Насколько я понимаю ошибка идет из 15 строки где вызывается колбек, только я не понимаю, что там не так...

Спасибо!

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 месяцев