我試圖添加一個實用程序方法來將通知偵聽器附加到Angular的$q
承諾中,這些承諾由於某種原因而默認不提供。意圖是提供一種.update
方法,其可鏈接,現有的API相似:
myService.getSomeValue()
.then(function() { /* ... */ })
.catch(function() { /* ... */ })
.update(function() {
// do something useful with a notification update
});
通過一個答案在Get state of Angular deferred?引導,並且從所述Angular documentation for $q以及所述source code該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
我只注意到這一點,當我在寫一個簡單的例子,我用這個代碼沒有問題時的承諾從服務返回和其他承諾已經使用(如果這可能會產生影響?)。有沒有什麼辦法可以讓鏈接器立即鏈接時可靠地工作?