JavaScript — это однопоточный язык программирования, что означает, что одновременно может выполняться только одна операция. Это может сильно замедлить работу, если выполнение какой-либо операции занимает много времени, поэтому JavaScript использует асинхронный код. Пока программа ожидает события, которое произойдет в какой-то момент времени в будущем, JavaScript откладывает это событие и прослушивает, когда оно действительно сработает. Тем временем JavaScript будет продолжать выполнять другой код до тех пор, пока это событие, наконец, не сработает, и в этот момент оно будет запланировано для выполнения. Этот процесс вращается вокруг цикла событий, который постоянно работает в фоновом режиме, выполняя внутреннюю поддержку, ставя события в очередь для вызова и удаляя/выполняя их из списка. Когда асинхронный код, наконец, завершен, можно использовать функцию обратного вызова, чтобы продолжить с того места, где код остановился. В противном случае JavaScript перескочил бы к следующей части кода, потенциально выходя за рамки предполагаемого порядка действий.

Примеры асинхронных операций

Пример получения общего количества слов

В этом примере мы вычисляем сумму слов из двух файлов. fs — это модуль API файловой системы. Функция getWordCount получает расположение файла, filepath, и вызывает для него fs.readFile, который асинхронно считывает все содержимое этого файла. . Каждое слово этих данных разделяется на массив, длина которого wordCount равна количеству слов в файле. После этих асинхронных операций вызывается обратный вызов для этого wordCount.

Функция getTotalWordCount последовательно вызывает нашу предыдущую функцию getWordCount для расположения каждого из файлов, filePathOne и filePathTwo. . Результирующий wordCount, возвращаемый каждый раз, добавляется к totalWordCount. Опять же, после завершения всех асинхронных операций вызывается обратный вызов для результата нашего totalWordCount.

Как видно из предыдущего примера, объединение нескольких функций, для выполнения которых требуется обратный вызов, может привести к длинному стеку вызовов, который будет сложно отлаживать. Это часто называют «адом обратных вызовов».

Преимущества асинхронного кода

  • Выполняйте работу, ожидая выполнения другой работы

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

  • Улучшить пользовательский интерфейс

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

Недостатки асинхронного кода

  • Одновременно может выполняться только одно действие, асинхронные действия могут испортить время запланированных действий.
  • Callback Hell: кошмар отладки стека вызовов