2.1 Создание промисов
Промисы (Promises) — это объект, представляющий завершение (или неудачу) асинхронной операции и ее результат. Они были введены в ES6 (ECMAScript 2015) и стали стандартным способом работы с асинхронным кодом в JavaScript.
Основные концепции
Промис может находиться в одном из трех состояний:
- Pending (ожидание): начальное состояние, не выполнен и не отклонен.
- Fulfilled (выполнен): операция завершена успешно.
- Rejected (отклонён): операция завершена с ошибкой.
Создание промиса
Промис создается с использованием конструктора Promise, который принимает функцию-исполнитель (executor function). Эта функция принимает два аргумента: resolve и reject. Внутри этой функции выполняется асинхронный код, и в случае успеха вызывается resolve, а в случае ошибки — reject.
Синтаксис:
const promise = new Promise((resolve, reject) => {
// Асинхронная операция
if (/* успешное завершение */) {
resolve(value); // Успех
} else {
reject(error); // Ошибка
}
});
Пример создания промиса:
const myPromise = new Promise((resolve, reject) => {
const success = true; // Условие для успешного выполнения
if (success) {
resolve('Operation was successful');
} else {
reject('Operation failed');
}
});
2.2 Использование промисов
Метод then
Метод then используется для обработки успешного выполнения промиса. Он принимает две функции: первую для обработки успешного выполнения и вторую для обработки ошибок. Однако обычно для обработки ошибок используется метод catch.
Пример использования then:
myPromise.then(
(successMessage) => {
console.log(successMessage); // Выведет: Operation was successful
},
(errorMessage) => {
console.error(errorMessage); // Будет вызвано в случае ошибки
}
);
Метод catch
Метод catch используется для обработки ошибок промиса. Он принимает одну функцию, которая будет вызвана в случае отклонения промиса.
Пример использования catch:
myPromise
.then((successMessage) => {
console.log(successMessage);
})
.catch((errorMessage) => {
console.error(errorMessage); // Будет вызвано: Operation failed
});
Метод finally
Метод finally используется для выполнения кода независимо от результата промиса (успешный или с ошибкой). Он не принимает аргументов и выполняется в любом случае после выполнения или отклонения промиса.
Пример использования finally:
myPromise
.then((successMessage) => {
console.log(successMessage);
})
.catch((errorMessage) => {
console.error(errorMessage);
})
.finally(() => {
console.log('Operation completed'); // Будет вызвано в любом случае
});
2.3 Примеры использования промисов
Пример 1: Асинхронная операция с использованием промиса
Симуляция асинхронной операции с таймером.
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve('Async operation was successful');
} else {
reject('Async operation failed');
}
}, 2000);
});
}
asyncOperation()
.then((message) => {
console.log(message);
})
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log('Async operation completed');
});
Пример 2: Последовательное выполнение промисов
Симуляция последовательных асинхронных операций.
function firstOperation() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('First operation completed');
resolve('First result');
}, 1000);
});
}
function secondOperation(result) {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Second operation completed');
resolve(`Second result, received: ${result}`);
}, 1000);
});
}
firstOperation()
.then((result) => {
return secondOperation(result);
})
.then((finalResult) => {
console.log(finalResult);
})
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log('Both operations completed');
});
Пример 3: Параллельное выполнение промисов с Promise.all
Симуляция параллельных асинхронных операций.
function operationOne() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Operation One completed');
resolve('Result One');
}, 1000);
});
}
function operationTwo() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Operation Two completed');
resolve('Result Two');
}, 1500);
});
}
Promise.all([operationOne(), operationTwo()])
.then((results) => {
console.log('All operations completed');
console.log(results); // Выведет: ['Result One', 'Result Two']
})
.catch((error) => {
console.error('One of the operations failed', error);
});
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ