Новое в ES2018: Promise.prototype.finally()

Node.js внешний интерфейс Promise NPM

Джордан Харбанд представляет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 не имеет никакого эффекта. Это связано с тем, что этот метод не может отличить явный возврат от обратного вызова, который завершается нормально.

Доступность

Подробнее


Оригинал: http://exploringjs.com/es2018-es2019/ch_promise-prototype-finally.html