AngularJS украшает $ q с сокращением для .notify

0

Я пытаюсь добавить метод утилиты для подключения уведомлений слушателей к Angular $q обещаниям, которые по умолчанию не предоставляются по умолчанию. Намерение состоит в том, чтобы обеспечить .update метод, который может использоваться в цепочке, по аналогии с существующим API:

myService.getSomeValue()
  .then(function() { /* ... */ })
  .catch(function() { /* ... */ })
  .update(function() { 
      // do something useful with a notification update
  });

Руководствуясь ответом в разделе "Получить состояние углового отсрочки"? , и видя из документа Angular для $ q, а также исходного кода, что catch просто определяется как promise.then(null, callback), я реализовал этот блок конфигурации:

.config(['$provide', function($provide) {
  $provide.decorator('$q', function ($delegate) {
    var defer = $delegate.defer;
    $delegate.defer = function() {
      var deferred = defer();

      deferred.promise.update = function(callback) {
        return deferred.promise.then(null, null, callback);
      };
      return deferred;
    };
    return $delegate;
  });
}]);

Какие виды работ, но похоже, что вышеупомянутый декоратор не устанавливается сразу, что нарушает интерфейс цепочки. В первый раз определяется $q.defer() (может быть, за блок?)

first.promise
  .then(function() { /* ... */ })
  .update(function() { 
      // do something useful with a notification update
  });

выдает TypeError: first.promise.then(...).update is not a function.

Пример здесь: http://plnkr.co/edit/5utIm0HXpIKsjsA4H9oS

Я только заметил это, когда писал простой пример, я использовал этот код без проблем, когда обещания были возвращены из службы, а другие обещания уже использовались (если это может повлиять?). Есть ли способ получить пример plunker для надежной работы сразу после цепочки?

Теги:
angular-promise

1 ответ

1

Отложенные и обещание - это два разных API в Angular, и таким образом оформляется только обещание, относящееся к defer, в то время как обещание, полученное с этого then, не является.

Оба они используют конструктор Promise() который нигде не отображается на $q. Однако Promise.prototype может быть изменен с помощью

   Object.getPrototypeOf(deferred.promise).update = function(callback) { ... };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню