angularjs http服务等待数据

时间:2016-08-09 09:13:45

标签: angularjs

我有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服务,但我仍然从我的服务中得到承诺而没有数据。

我需要在代码中更改什么才能使服务等待数据?

3 个答案:

答案 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.
}