Я пытаюсь добавить метод утилиты для подключения уведомлений слушателей к 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 для надежной работы сразу после цепочки?
Отложенные и обещание - это два разных API в Angular, и таким образом оформляется только обещание, относящееся к defer
, в то время как обещание, полученное с этого then
, не является.
Оба они используют конструктор Promise()
который нигде не отображается на $q
. Однако Promise.prototype может быть изменен с помощью
Object.getPrototypeOf(deferred.promise).update = function(callback) { ... };