我正在为REST API实现一个围绕$ http的瘦包装器,我希望它以与$ http相同的方式返回一个承诺(在我按摩数据之后)。
这是我的服务:
Services.service('Item', ['$http', '$q', function($http, $q){
var deferred = $q.defer();
var getSuccess = function(data, status, headers, config){
var item = angular.copy(data);
item.primaryImage = 'https://my.cdn.com/' + item.meta.images[0].s3id;
if(item.meta.source_link !== null) {
item.sourceLink = item.meta.source_link.url;
}
deferred.resolve(item, data, status, headers, config);
};
var getError = function(data, status, headers, config) {
deferred.reject(data, status, headers, config);
};
this.get = function(userID, itemID) {
$http({
method: 'GET',
url: '/api/items/' + userID + '/' + itemID
}).success(getSuccess).error(getError);
return deferred.promise;
};
}]);
但根据我对documentation的理解,我必须使用.then(success, error, always)
而不是.success().error().always()
,就像$http
一样。
是否可以像$http
那样实现承诺?我很乐意这样做
var req = Item.get($routeParams.userID, $routeParams.itemID);
req.success(function(item){
window.console.log('Got an item!', item);
});
.error(function(item){
window.console.log('Damn. It failed.')
})
答案 0 :(得分:1)
这个问题让我在了解了你真正想要的东西之后搜索了一下。
我做了一个plnkr,展示了我是如何解决这个问题的:http://plnkr.co/edit/LoCuwk26MEZXsugL1Ki5
现在,重要的部分是:
var promise = defered.promise;
promise.success = function(fn) {
promise.then(function(res) {
fn(res);
});
return promise;
};
promise.error = function(fn) {
promise.then(null, function(err) {
fn(err);
});
return promise;
};
return promise
此代码直接来自angular source code。所以我相信如果你想复制那种风格,那就是要走的路。
我确实注意到你的代码中有错误。所有服务都是单身人士。这意味着您只创建一个延迟对象。您应该在每次通话时创建一个并使用它。