我有HTTP服务,它向inspection2update.DamageTypeId
属性返回promise,并继续执行。
HTTP服务:
function post(objectTypeId, damageDescription) {
var defer = $q.defer();
$http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription).then(function (response) {
defer.resolve(response.data);
});
return defer.promise;
}
这里我如何在控制器中调用服务:
inspection2update.DamageTypeId = damageTypesService.save(inspection2update.ObjectTypeId, self.dType);
但我需要等到我从服务中获取数据,然后才能获得数据,以便进一步执行。
为此,我在$ http解析器中使用$q
服务,但我仍然从我的服务中得到承诺而没有数据。
我需要在代码中更改什么才能使服务等待数据?
答案 0 :(得分:2)
您正在返回一个在http
调用完成获取数据后解析的promise。使用此服务的消费者需要等待承诺解决并then
对数据执行某些操作。
使用then
语法接收承诺数据并进一步执行:
damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) {
inspection2update.DamageTypeId = data;
// rest of execution...
});
P.S - 据我所知,在你的情况下没有使用$q
(除非你想与数据/制作日志等混合......)。您可以按原样返回$http
来电:
function save(objectTypeId, damageDescription) {
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription);
}
答案 1 :(得分:2)
使用最佳角度promise
和$q
function save (objectTypeId, damageDescription) {
var deferred = $q.defer();
$http({
url: serviceAddress + "save/" + objectTypeId + "/" ,
method: 'POST',
data: damageDescription
})
.success(function (data) {
deferred.resolve(data);
})
.error(function (data) {
deferred.resolve(data);
});
return deferred.promise;
}
在您的控制器中使用.then
功能
damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(response){
/*use the response here
eg: inspection2update.DamageTypeId = response.id
*/
})
答案 2 :(得分:2)
首先,您的服务方法名为post
,并且您正在调用名为save
的方法。这是一个错误吗?其次,我认为您不应该使用$http
服务,因为它是低级别的,您的请求很简单。你应该结帐$resource它提供了更高级别的抽象,并且可以像你的那样直接请求。现在,解决你的问题。 $http
和$resource
都会返回一个承诺。因此,通常在您的服务或控制器中,您提供一个回调,该回调接收来自请求的响应并对其进行处理。由于$ resource和$http
的方法相似,但您询问了$http
我将使用$http
向您展示。
function post(objectTypeId, damageDescription) {
return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription);
}
现在,在您的控制器中,您可以像这样调用服务方法post()
。
damageTypesService.post(inspection2update.ObjectTypeId, self.dType).then(mycallback);
function myCallback(response){
inspection2update.DamageTypeId = response; // DamageTypeId now won't be populated until the request is resolved.
}