我有这样的服务
app.service('newsService', function($q, $timeout,$http) {
this.getNewsName = function(id) {
var deferred = $q.defer();
var newsId = parseInt(id, 10);
$timeout(function() {
$http({
url: "entry/GetNewsTitle",
method: "POST",
data: $.param({'id':newsId}),
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
.success(function(data, status, headers, config) {
deferred.resolve(data.name);
})
.error(function(data, status, headers, config) {
console.log('failed');
});
}, 10);
return deferred.promise;
}
另一个函数中的console.log(deferred.promise)
给了我三个函数" catch" "最后"然后"然后"但我怎样才能再次达到data.name
?
答案 0 :(得分:4)
像这样:
newsService.getNewsName(id).then(function(name) {
});
答案 1 :(得分:2)
首先,您应该优化服务方法以避免Deferred anti-pattern。您不需要创建虚拟延迟对象,因为$http(...)
已经返回Promise。
服务看起来像这样:
app.service('newsService', function($http) {
this.getNewsName = function(id) {
return $http({
url: "entry/GetNewsTitle",
method: "POST",
data: $.param({
'id': parseInt(id, 10)
}),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
}).success(function(data, status, headers, config) {
return data.name;
}).error(function(data, status, headers, config) {
console.log('failed');
});
};
});
注意,getNewsName
会返回$http
的结果。
使用此服务的控制器将使用Promise API链接到它:
newsService.getNewsName(123).then(function(name) {
console.log(name);
});