Вместо блокировки выполнения программы для ожидания завершения операции, асинхронные операции инициируются и продолжают выполняться параллельно, в то время как основной поток программы продолжает работу.
Когда асинхронная операция завершается, вызывается обратный вызов (callback) или возвращается промис, который позволяет выполнить дополнительные действия по завершении операции.
Асинхронное программирование особенно полезно в случаях, когда операции требуют большого количества времени для выполнения, например, загрузка данных с сервера или выполнение запросов к базе данных.
Вместо блокировки всего потока выполнения программы, асинхронное программирование позволяет продолжать работу с другими частями программы, тогда как асинхронная операция выполняется в фоновом режиме. Примеры асинхронного программирования в JavaScript
Callback функции
Callback функции - это один из самых распространенных механизмов асинхронного программирования в JavaScript. Они представляют собой функции, которые передаются в качестве аргументов другим функциям и вызываются по завершении определенной операции. Вот пример использования callback функции для асинхронного чтения файла в Node.js:
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (error, data) => { if (error) { console.error('Ошибка чтения файла:', error); return; } console.log('Содержимое файла:', data); });
В этом примере мы используем функцию readFile из модуля fs для асинхронного чтения файла file.txt. При завершении операции чтения файла, вызывается callback функция, которая принимает два аргумента: error (ошибка, если есть) и data (содержимое файла). Если при чтении файла возникает ошибка, мы выводим сообщение об ошибке. В противном случае, мы выводим содержимое файла.
Промисы (Promises)
Промисы - это объекты, которые представляют результат асинхронной операции, которая может быть выполнена или отклонена. Промисы обеспечивают удобный способ обработки асинхронных операций с использованием цепочек методов then() и catch(). Вот пример использования промисов для асинхронного запроса к серверу с использованием Fetch API:
fetch('https://api.example.com/data') .then(response => response.json()) .then(data => { console.log('Полученные данные:', data); }) .catch(error => { console.error('Ошибка запроса:', error); });
В этом примере мы используем функцию fetch() для выполнения асинхронного запроса к URL-адресу https://api.example.com/data. Метод fetch() возвращает промис, который разрешается с объектом Response. Мы используем метод .json() для извлечения данных из ответа. Затем мы используем методы then() для обработки разрешенного промиса и получения данных. Если происходит ошибка, мы используем метод catch() для ее обработки.
Асинхронные функции (Async/await)
Асинхронные функции - это новый синтаксический сахар, представленный в ECMAScript 2017 (ES8), который упрощает асинхронное программирование в JavaScript. Они позволяют писать асинхронный код таким образом, будто он синхронный, используя ключевые слова async и await. Вот пример использования асинхронной функции для асинхронного чтения файла с использованием модуля fs в Node.js:
const fs = require('fs'); async function readFileAsync() { try { const data = await fs.promises.readFile('file.txt', 'utf8'); console.log('Содержимое файла:', data); } catch (error) { console.error('Ошибка чтения файла:', error); } } readFileAsync();
В этом примере мы определяем асинхронную функцию readFileAsync(), которая использует ключевое слово await для ожидания завершения операции чтения файла.
Мы используем метод fs.promises.readFile(), который возвращает промис, и вызываем его внутри асинхронной функции. Если операция чтения файла успешно завершается, мы выводим содержимое файла. Если возникает ошибка то выводится сообщение об этом.