2015-08-29 59 views
0

我試圖添加一個實用程序方法來將通知偵聽器附加到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 codecatch被簡單地定義爲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

我只注意到這一點,當我在寫一個簡單的例子,我用這個代碼沒有問題時的承諾從服務返回和其他承諾已經使用(如果這可能會產生影響?)。有沒有什麼辦法可以讓鏈接器立即鏈接時可靠地工作?

回答