StudyCode
Обещания в JavaScript: создание, then/catch/finally, Promise.all и другие методы.
Promise — объект, представляющий будущий результат асинхронной операции.
Promise имеет три состояния:
Переход из pending — необратим: нельзя выполненный Promise снова сделать pending.
const promise = new Promise((resolve, reject) => {
// Асинхронная операция
setTimeout(() => {
if (Math.random() > 0.5) {
resolve("Успех!"); // → fulfilled
} else {
reject(new Error("Ошибка!")); // → rejected
}
}, 1000);
});promise
.then((result) => {
console.log("Получено:", result); // выполнено при resolve
return result.toUpperCase(); // можно вернуть новое значение
})
.then((upper) => {
console.log("Обработано:", upper); // получает результат предыдущего then
})
.catch((error) => {
console.error("Ошибка:", error.message); // выполнено при reject
})
.finally(() => {
console.log("Готово"); // всегда, независимо от результата
});// Промисификация — обёртка колбэка в Promise
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function randomFetch(url) {
return new Promise((resolve, reject) => {
// Имитация запроса
setTimeout(() => {
if (Math.random() > 0.3) {
resolve({ url, data: "some data" });
} else {
reject(new Error(`Failed to fetch ${url}`));
}
}, 500);
});
}
randomFetch("/api/users")
.then(({ data }) => {
console.log("Данные:", data);
return delay(1000); // ждём секунду
})
.then(() => randomFetch("/api/posts"))
.then(({ data }) => console.log("Посты:", data))
.catch((err) => console.error("Упс:", err.message));console.log('start');
setTimeout(() => console.log('setTimeout!'), 0);
Promise.resolve().then(() => console.log('Promise!'));
console.log('end');
// Вывод:
// start
// end
// Promise!
// setTimeout!