Проверяет понимание особенностей выполнения обработчика finally для промисов в JavaScript и случаев его многократного вызова.
Метод finally в JavaScript добавляет обработчик, который выполняется после завершения промиса, независимо от того, был ли он разрешён (fulfilled) или отклонён (rejected). Обычно он используется для очистки ресурсов или выполнения завершающих действий. По спецификации ECMAScript, промис может перейти в состояние fulfilled или rejected только один раз, и все последующие вызовы resolve или reject игнорируются. Однако есть нюансы, связанные с тем, как обработчики регистрируются и вызываются.
В стандартном поведении промиса, если внутри исполнителя (executor) вызвать resolve или reject несколько раз, только первый вызов влияет на состояние промиса. Обработчики, включая finally, вызываются один раз. Но есть исключения: если промис создаётся с помощью конструктора и внутри исполнителя используется асинхронный код, который вызывает resolve или reject после того, как промис уже разрешён, это не приведёт к повторному вызову. Однако в некоторых средах или при использовании полифиллов, которые не полностью соответствуют спецификации, возможны отклонения. Также, если вы создаёте собственный объект, имитирующий промис, и вызываете обработчики вручную, то finally может быть вызван несколько раз.
const promise = new Promise((resolve, reject) => {
resolve('first');
resolve('second'); // игнорируется
reject('error'); // игнорируется
});
promise.finally(() => {
console.log('finally called');
});
// Выведет 'finally called' один раз
В этом примере, несмотря на три вызова, промис разрешается только один раз, и finally вызывается один раз. Однако, если вы используете нестандартный подход, например, создаёте объект с методом finally, который вызывает обработчик при каждом изменении состояния, то он может сработать несколько раз.
В стандартном JavaScript обработчик finally для одного и того же промиса срабатывает ровно один раз, так как промис может быть разрешён только один раз. Многократное срабатывание возможно только при нарушении спецификации или при использовании кастомных реализаций. Поэтому на практике можно полагаться на однократное выполнение finally для корректной очистки ресурсов.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию