如何等待角度http方法完成

时间:2015-11-19 14:24:11

标签: javascript angularjs

这是我从服务器获取数据的功能

function getAll_Tables() {
  $scope.tableList = [];
  $http({
    method : 'GET',
    url : '/abc/GetTables',
    headers : {'Content-Type' : 'application/json'}
  }).success(function(data) {
      $('#T_LoaderSpinner').hide();
      if (data.StatusCode === 101) {
        if (data.Data != null) {
          for (var i = 0; i < data.Data.length; i++) {
            $scope.tableList.push(data.Data[i]);
          }
        }
      } else {
        alert("We could not process your request......Please try later.")
      }
    })
    .error(function(data) {
      $('#T_LoaderSpinner').hide();
      alert("We could not process your request......Please try later.")
    });
} 

我使用该数据的另一个功能是:

$scope.load_policy = function(id, type) {
  $scope.getRuleList();
  getAll_ScoringTables(); 
  alert(JSON.stringify($scope.tableList));
}

我的tableList没有得到更新 - 如何在这里获取更新的tableList?

3 个答案:

答案 0 :(得分:4)

这是一种更舒适的方式,使用促销

var promise1 = $http({method: 'GET', url: 'a/pi-one-url', cache: 

'true'});
var promise2 = $http({method: 'GET', url: '/api-two-url', cache: 'true'});

$q.all([promise1, promise2]).then(function(data){
    console.log(data[0], data[1]);
});

答案 1 :(得分:1)

您可能需要返回http请求,只需处理加载策略中的成功,或者您可以使用回调来调用从success方法调用的匿名函数。这将在成功完成后调用您的匿名函数

function getAll_Tables(callback) { 
    $scope.tableList = [];
    $http({
        method : 'GET',
        url : '/abc/GetTables',
        headers : {'Content-Type' : 'application/json'}
    }).success(function(data) { 
        $('#T_LoaderSpinner').hide();
        callback();
    }).error(function(data) { 
        $('#T_LoaderSpinner').hide();
        alert("We could not process your request......Please try later.")
    });
}  

$scope.load_policy = function(id, type) { 
    $scope.getRuleList(function() {
        getAll_ScoringTables(); 
        alert(JSON.stringify($scope.tableList));
    });
}

所以其他选项之一就是

function getAll_Tables(callback) { 
    $scope.tableList = [];
    return $http({
        method : 'GET',
        url : '/abc/GetTables',
        headers : {'Content-Type' : 'application/json'}
    });
}  

$scope.load_policy = function(id, type) { 
    $scope.getRuleList.success(function() {
        getAll_ScoringTables(); 
        alert(JSON.stringify($scope.tableList));
    }).error(function() {
        alert('failed');
    });
}

答案 2 :(得分:1)

您的问题是getAll_Tables()是异步的,因此在使用它的函数中,当您执行alert时尚未获取数据。你需要等待这个承诺完成。我建议进行以下更改:

function getAll_Tables() {
  $scope.tableList = [];
  return $http({ // ADDED RETURN HERE
    method : 'GET',
    url : '/abc/GetTables',
    headers : {'Content-Type' : 'application/json'}
  }).success(function(data) {
      $('#T_LoaderSpinner').hide();
      if (data.StatusCode === 101) {
        if (data.Data != null) {
          for (var i = 0; i < data.Data.length; i++) {
            $scope.tableList.push(data.Data[i]);
          }
          return; // ADDED RETURN HERE
        }
      } else {
        alert("We could not process your request......Please try later.")
      }
    })
    .error(function(data) {
      $('#T_LoaderSpinner').hide();
      alert("We could not process your request......Please try later.")
    });
}

因此,我们将$http函数从getAll_Tables()返回,因此我们可以在其他函数中.then,或者换句话说,等到请求完成之前继续使用.then函数中的代码。

$scope.load_policy = function(id, type) {
  $scope.getRuleList();
  getAll_ScoringTables()
  .then(function() {
    alert(JSON.stringify($scope.tableList)); // tableList has the correct data now
  })
}