Вопрос проверяет понимание асинхронности в JavaScript и возможных проблем с незавершающимися Promise.
Promise в JavaScript может остаться в состоянии pending навсегда, если ни resolve, ни reject не были вызваны. Это не ошибка выполнения, а логическая проблема, которая часто возникает из-за невнимательности или сложных асинхронных сценариев.
// Promise, который никогда не завершится
const foreverPending = new Promise((resolve, reject) => {
// Ни resolve, ни reject не вызваны
console.log('Я навсегда в pending');
});
// Этот then никогда не выполнится
foreverPending.then(
value => console.log('resolve:', value),
error => console.log('reject:', error)
);
// Пример с ошибкой до вызова
const brokenPromise = new Promise((resolve, reject) => {
throw new Error('Ошибка до resolve'); // Promise будет rejected, а не pending
resolve('никогда не выполнится');
});
// Пример с асинхронной операцией, которая может не завершиться
function waitForEvent(target, event) {
return new Promise((resolve) => {
target.addEventListener(event, resolve, { once: true });
// Если событие никогда не произойдёт, Promise останется pending
});
}Promise.race с таймером для ограничения времени ожиданияНезавершающиеся Promise — это источник трудноотлавливаемых багов и утечек памяти. Всегда проверяйте, что ваши Promise гарантированно завершаются, особенно при работе с событиями или внешними ресурсами. Используйте таймауты и обработку ошибок для предотвращения таких ситуаций.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию