Джордан Харбанд представляетPromise.prototype.finally
предложения к этой главе.
как работать?
.finally() используется следующим образом:
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
Наконец, обратные вызовы всегда выполняются. В качестве сравнения:
- затем обратный вызов только тогда, когда обещание будет выполнено, оно будет выполнено.
- Обратный вызов catch будет выполнен только в том случае, если обещание отклонено, или обратный вызов then выдает исключение или возвращает отклоненное обещание. Другими словами, следующий фрагмент кода:
promise
.finally(() => {
«statements»
});
Эквивалентно:
promise
.then(
result => {
«statements»
return result;
},
error => {
«statements»
throw error;
}
);
Случаи применения
Наиболее распространенный вариант использования похож на синхронизированное предложение finally: выполнение некоторой очистки после обработки ресурса. Такая работа необходима, с ошибками или без. Например:
let connection;
db.open()
.then(conn => {
connection = conn;
return connection.select({ name: 'Jane' });
})
.then(result => {
// Process result
// Use `connection` to make more queries
})
···
.catch(error => {
// handle errors
})
.finally(() => {
connection.close();
});
.finally() похож на finally {} в синхронном коде.
В синхронном коде оператор try делится на три части: предложение try, предложение catch и предложение finally. Сравните обещания:
- Предложение try эквивалентно вызову функции на основе Promise или метода .then().
- Предложение catch эквивалентно методу Promise .catch().
- Предложение finally эквивалентно недавно представленному методу .finally() в Promise.
Тем не менее, finally {} может возвращать и выбрасывать, в то время как в .finally() обратный вызов может только выбрасывать, return не имеет никакого эффекта. Это связано с тем, что этот метод не может отличить явный возврат от обратного вызова, который завершается нормально.
Доступность
-
пакет нпм
promise.prototype.finally
это полифилл для .finally() - V8 5.8+ (например, Node.js 8.1.4+): доступно с флагом --harmony-promise-finally. (понять больше)
Подробнее
Оригинал: http://exploringjs.com/es2018-es2019/ch_promise-prototype-finally.html