then вызывается при успешном выполнении Promise, catch — при ошибке, а finally — всегда, независимо от результата. finally выполняется после then или catch, но не меняет значение, если сам не выбрасывает ошибку. Все эти колбэки выполняются как микротаски. Порядок строго следует цепочке.
then вызывается при успешном выполнении Promise, catch — при ошибке, а finally — всегда, независимо от результата. finally выполняется после then или catch, но не меняет значение, если сам не выбрасывает ошибку. Все эти колбэки выполняются как микротаски. Порядок строго следует цепочке.
Promise проходит одно из состояний:
fulfilled → вызываются then
rejected → вызываются catch
После этого всегда выполняется finally
Promise.resolve(1)
.then(v => {
console.log('then', v);
return v + 1;
})
.finally(() => {
console.log('finally');
});
Порядок вывода:
then 1
finally
Promise.reject('err')
.then(() => {
console.log('then');
})
.catch(e => {
console.log('catch', e);
})
.finally(() => {
console.log('finally');
});
Порядок вывода:
catch err
finally
finallyfinally не получает результат
finally не изменяет цепочку, если:
не возвращает Promise
не выбрасывает ошибку
Promise.resolve(1)
.finally(() => 100)
.then(v => console.log(v)); // 1
then и catch обрабатывают результат или ошибку, а finally — это место для очистки ресурсов. Он выполняется всегда и не влияет на данные, если не делает этого явно.