Promises: Выполнять что-то независимо от разрешения/отклонения?

Используя шаблон дизайна Promises, можно ли реализовать следующее:

 var a, promise

 if promise.resolve
     a = promise.responsevalue;

 if promise.reject
     a = "failed"

 AFTER resolution/rejection. Not ASYNC!!
     send a somewhere, but not asynchronously. //Not a promise

То, что я ищу, похоже на finally в ситуации try - catch.

PS: Я использую ES6 Promise polyfill в NodeJS

Ответ 1

Если вы вернете значение из catch, вы можете просто использовать then в результате catch.

thePromise.then(result => doSomething(result)
          .catch(error => handleErrorAndReturnSomething(error))
          .then(resultOrReturnFromCatch => /* ... */);

... но это означает, что вы конвертируете отказ в разрешение (возвращая что-то из catch вместо того, чтобы бросать или возвращать отклоненное обещание) и полагается на этот факт.


Если вы хотите что-то прозрачно проходить по разрешению/отказу без его изменения, в ES2015 ( "ES6" ) promises ничего не встроено, но это легко написать (это в ES2015, но у меня есть перевод ES5 ниже):

{
    let worker = (p, f, done) => {
        return p.constructor.resolve(f()).then(done, done);
    };
    Object.defineProperty(Promise.prototype, "finally", {
        value(f) {
            return this.then(
                result => worker(this, f, () => result),
                error  => worker(this, f, () => { throw error; })
            );
        }
    });
}

Пример:

{
  let worker = (p, f, done) => {
    return p.constructor.resolve(f()).then(done, done);
  };
  Object.defineProperty(Promise.prototype, "finally", {
    value(f) {
      return this.then(
        result => worker(this, f, () => result),
        error  => worker(this, f, () => { throw error; })
      );
    }
  });
}
test("p1", Promise.resolve("good")).finally(
  () => {
    test("p2", Promise.reject("bad"));
  }
);
function test(name, p) {
  return p.then(
    result => {
      console.log(name, "initial resolution:", result);
      return result;
    },
    error => {
      console.log(name, "initial rejection; propagating it");
      throw error;
    }
  )
  .finally(() => {
    console.log(name, "in finally");
  })
  .then(
    result => {
      console.log(name, "resolved:", result);
    },
    error => {
      console.log(name, "rejected:", error);
    }
  );
}

Ответ 2

Код ES2015:

promise.then(val => val).catch(() => "failed").then(a => doSomethigWithA(a));

Ответ 3

Это может быть специфический для AngularJS, но:

API обещаний Новый экземпляр обещания создается, когда созданный отложенный экземпляр создается и может быть получен путем вызова отложенного.произведения.

Цель объекта обещания - дать возможность заинтересованным сторонам получить доступ к результату отложенной задачи при ее завершении.

Методы

then (successCallback, [errorCallback], [notifyCallback]) - независимо от того, когда обещание было или будет разрешено или отклонено, затем вызывает один из успешных или ошибочных обратных вызовов асинхронно, как только результат будет доступен. Обратные вызовы вызываются с помощью одного аргумента: причина или отклонение. Кроме того, обратный вызов уведомления может быть вызван ноль или более раз, чтобы обеспечить индикацию прогресса, прежде чем обещание будет разрешено или отклонено.

Этот метод возвращает новое обещание, которое разрешено или отклонено с помощью возвращаемого значения successCallback, errorCallback (если это значение не является обещанием, и в этом случае оно разрешается с помощью значения, которое разрешено в этом обещании с использованием цепочки взаимосвязи), Он также уведомляет через возвращаемое значение метода notifyCallback. Обетование не может быть разрешено или отклонено из метода notifyCallback. Аргументы errorCallback и notifyCallback не являются обязательными.

catch (errorCallback) - сокращенное обозначение для обещания. then (null, errorCallback)

finally (callback, notifyCallback) - позволяет наблюдать либо выполнение, либо отказ от обещания, но сделать это без изменения окончательного значения. Это полезно для выпуска ресурсов или выполнения некоторой очистки, которая должна быть выполнена, если обещание было отклонено или разрешено. Подробнее см. Полную спецификацию.

Источник: https://docs.angularjs.org/api/ng/service/ $q