处理来自承诺结果的数据

时间:2016-05-03 16:58:48

标签: javascript angularjs angular-promise angular-services

var prom = $http.get('url');
prom.success(function(data){
  //here calling some service and updating the data 
});
$scope.abc = function(){
//doing some calculation with updated data
}

一旦我从http请求中获取数据,我正在调用一些服务,该服务会向接收的数据添加一些信息。即data + service()= updatedData。 现在,在这个更新的数据上,我正在应用一些计算,并在视图中显示它。 但是这件事没有用。我尝试将此计算添加到 prom.success 本身,但我仍然没有获得更新数据。我尝试将 setInterval()添加到$ scope.abc,但有时它显示有时不会。

请帮我解决这个问题。

谢谢

1 个答案:

答案 0 :(得分:1)

在将解析数据的服务中编写方法。在方法中首先调用$ http来获取数据。获得数据后,请拨打第二项服务,这将添加额外的信息。完成后(即已解决第二个服务的承诺),解析更新数据。从控制器中调用服务中的此方法,并等待它被重新保存。当它改变了; '然后'在将显示数据的范围上调用您的方法。我会为你发一个工作小提琴。

您可以查看小提琴here

<强>服务

myApp.factory('service', function($http, $q) {
  var addInfoToData = function(data) {
    var deferred = $q.defer();
    data.updatedInfo = "Some dummy info";
    deferred.resolve(data);
    return deferred.promise;
  };

  //Dummy Method for $http call
  var callApi = function() {
    var deferred = $q.defer();
    var dummyData = {
      Id: 1,
      Name: "Fake Info",
      Value: 15
    };
    deferred.resolve(dummyData);
    return deferred.promise;
  }

  var getData = function() {
    var deferred = $q.defer();
    //Replace with $http
    callApi().then(function(data) {
      addInfoToData(data).then(function(updatedData) {
        deferred.resolve(data);
      })
    })
    return deferred.promise;
  }

  return {
    getData: getData
  }
})

注意:callApi方法是$ http调用的虚方法。将其替换为您的实际API调用。

<强>控制器

function MyCtrl($scope, service) {
  $scope.name = 'Superhero';
  $scope.abc = function(data) {
    data.Value = data.Value / 100;
    $scope.displayData = data;
  }
  var getData = function() {
    service.getData().then(function(data) {
      $scope.abc(data);
    })
  }

  getData();
}