.finally
.finally(function() handler) -> Promise
.lastly(function() handler) -> Promise
Передайте обработчик, который будет вызван независимо от судьбы этого промиса. Возвращает новый промис, связанный с этим промисом. Для .finally существуют особые семантика, в том, что конечное значение не может быть изменено из обработчика.
Примечание: использование .finally для управления ресурсами имеет лучшие альтернативы, см. управление ресурсами
Рассмотрим пример:
function anyway() {
$("#ajax-loader-animation").hide();
}
function ajaxGetAsync(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.addEventListener("error", reject);
xhr.addEventListener("load", resolve);
xhr.open("GET", url);
xhr.send(null);
}).then(anyway, anyway);
}
Этот пример не работает так, как задумано, потому что обработчик then фактически перехватывает исключение и возвращает undefined для любых последующих цепочек.
Ситуацию можно исправить с помощью .finally:
function ajaxGetAsync(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.addEventListener("error", reject);
xhr.addEventListener("load", resolve);
xhr.open("GET", url);
xhr.send(null);
}).finally(function() {
$("#ajax-loader-animation").hide();
});
}
Теперь анимация скрыта, но, если она не вызывает исключение, функция не влияет на выполненное или отклоненное значение возвращаемого промиса. Это аналогично тому, как работает ключевое слово синхронного finally.
Если функция-обработчик, переданная .finally возвращает промис, промис, возвращенный .finally не будет завершен до тех пор, пока не будет завершен промис, возвращенный обработчиком. Если обработчик выполняет свой промис, возвращаемый промис будет выполнен или отклонен с исходным значением. Если обработчик отклоняет свой промис, возвращаемый промис будет отклонен со значением обработчика. Это аналогично выбросу исключения в синхронном блоке finally, что приводит к тому, что исходное значение или исключение будут забыты. Эта задержка может быть полезна, если действия, выполняемые обработчиком, выполняются асинхронно. Например:
function ajaxGetAsync(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.addEventListener("error", reject);
xhr.addEventListener("load", resolve);
xhr.open("GET", url);
xhr.send(null);
}).finally(function() {
return Promise.fromCallback(function(callback) {
$("#ajax-loader-animation").fadeOut(1000, callback);
});
});
}
Если завершение затемнения прошло успешно, возвращаемый промис будет выполнен или отклонен со значением из xhr. Если .fadeOut сгенерирует исключение или передаст ошибку в обратный вызов, возвращаемый промис будет отклонен с ошибкой от .fadeOut.
Для совместимости с более ранними версиями ECMAScript предоставлен псевдоним .lastly для .finally.
© 2013–2018 Petka Antonov
Licensed under the MIT License.
http://bluebirdjs.com/docs/api/finally.html