4.4 KiB
4.4 KiB
sidebar_position
| sidebar_position |
|---|
| 2 |
Promises
Источник Deepseek
Использование Promises (обещаний) в JavaScript — это более современный и удобный способ работы с асинхронными операциями по сравнению с callback-функциями. Promises позволяют избежать "callback hell" и делают код более читаемым и структурированным.
Вот пример асинхронного программирования с использованием Promises:
// Пример асинхронной функции, которая возвращает Promise
function fetchData() {
return new Promise((resolve, reject) => {
// Имитируем задержку с помощью setTimeout
setTimeout(() => {
const success = true; // Имитируем успешное выполнение или ошибку
if (success) {
const data = { name: "Alice", age: 25 };
resolve(data); // Успешное выполнение
} else {
reject("Ошибка: Данные не получены"); // Ошибка
}
}, 2000); // Задержка 2 секунды
});
}
// Использование Promise
fetchData()
.then((data) => {
console.log("Данные получены:", data);
})
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log("Запрос завершен.");
});
console.log("Ожидание данных...");
Объяснение:
- fetchData — это функция, которая возвращает
Promise. ВнутриPromiseвыполняется асинхронная операция (в данном случае, с задержкой в 2 секунды). - resolve — вызывается, если операция завершилась успешно. В этом случае
Promiseпереходит в состояние "fulfilled" (выполнено), и данные передаются в метод .then(). - reject — вызывается, если произошла ошибка. В этом случае
Promiseпереходит в состояние "rejected" (отклонено), и ошибка передается в метод .catch(). - .then() — обрабатывает успешный результат.
- .catch() — обрабатывает ошибки.
- .finally() — выполняется в любом случае, независимо от того, завершился
Promiseуспешно или с ошибкой.
Вывод в консоль:
Ожидание данных...
Данные получены: { name: "Alice", age: 25 }
Запрос завершен.
Если произойдет ошибка:
Если переменная success будет равна false, то вывод будет таким:
Ожидание данных...
Ошибка: Данные не получены
Запрос завершен.
Преимущества Promises:
- Более читаемый и структурированный код.
- Легко комбинировать несколько асинхронных операций с помощью
.then(). - Удобная обработка ошибок через
.catch().
Пример с цепочкой Promises:
fetchData()
.then((data) => {
console.log("Данные получены:", data);
return data.age; // Возвращаем только возраст
})
.then((age) => {
console.log("Возраст пользователя:", age);
})
.catch((error) => {
console.error(error);
});
Этот пример показывает, как можно последовательно обрабатывать данные с помощью цепочки .then().
💥 Thenable
Если быть более точными, обработчик может возвращать не именно промис, а любой объект, содержащий метод .then, такие объекты называют «thenable», и этот объект будет обработан как промис.