2016-08-09 43 views
3

我有HTTP服务,它返回承诺到inspection2update.DamageTypeId属性并继续执行更多。angularjs http服务等待数据

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 resolver中使用$q服务,但仍然得到我的服务承诺,并且没有数据。

我需要更改我的代码以使服务等待数据吗?

回答

2

您正在返回一个承诺,在http调用完成获取数据后解决。使用这项服务的消费者需要等待解决的承诺,并且对数据做些什么。

使用then语法收到承诺的数据,并进一步执行:

damageTypesService.save(inspection2update.ObjectTypeId, self.dType).then(function(data) { 
    inspection2update.DamageTypeId = data; 
    // rest of execution... 
}); 

PS - 据我可以看到有你的情况没有用的$q(除非你想用数据打成一片/制作日志等)。您可以返回$http呼叫作为是:

function save(objectTypeId, damageDescription) { 
    return $http.post(serviceAddress + "save/" + objectTypeId + "/" + damageDescription); 
} 
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 
    */ 
    }) 
+0

deferred.resolved(data)是什么意思?数据将在呼叫回复时解决。 –

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. 
} 
+0

我尝试在我的示例中使用它以获得它,并且它的剂量很大 – Michael

+0

请为您的示例提供这些更改的代码。并解释“不起作用的意义”。你收到什么错误? –