Наконец, заключить в angular 2 обещание

Я заметил, что в angular 2 окончательный блок для API обещаний

angular 1:

 loadUsers() {
  fetch('/api/users').then((response) => {
    return response.json();
  }).then((data) => {
    this.users = data;
  }).catch((ex) => {
    console.error('Error fetching users', ex);
  }).finally(() => {
     this.userLoaded = true;
};

Предполагая, что я должен сделать то же самое в angular 2

Как добавить окончательный блок в angular 2 обещание, на данный момент существует только then & catch blocks, доступное в angular 2. Если нет, наконец, есть ли способ добавить код очистки после выполнения каждого метода, где я пишу код для окончательного блокирования действий?

Ответ 1

Самый простой способ сделать это - использовать prom.finally shim.

  • Добавьте его с помощью npm install --save promise.prototype.finally
  • Добавьте титры: npm install --save-dev @types/promise.prototype.finally
  • В своем основном классе перед загрузкой приложения добавьте следующий код:
import { shim } from 'promise.prototype.finally';
shim();

Теперь вы можете использовать finally на promises.

Ответ 2

Обычно это делается с помощью Promise.always. Это берет одну функцию и добавляет новый .then в обещание, которое дает ту же функцию для состояний успеха и отказа. Если функция недоступна в данной среде, основанной на обещании, ее довольно легко использовать polyfill.

Promise.always = function(p, fn) {
  return p.then(fn, fn);
}

использование:

var prom = fetch('/api/users').then...
Promise.always(prom, () => {
  this.userLoaded = true;
});
return prom;