AngularJS两个http进入一个控制器时出现问题

时间:2018-07-12 01:28:13

标签: javascript angularjs angular-promise angular-http ng-controller

我在一个控制器中有两个http GET,有时它可以工作,其中两个正在工作。有时只有一个http Get可以工作。有时没有显示。 有什么建议吗?

 }).controller("nextSidorAdminCtrl", 
 function($scope,$rootScope,$http,$location,$state) {
   $http.get("/ShiftWeb/rest/admin/getallsettingtime")
  .then(function(response) {
    $scope.settingtimes = response.data;
 });    
 $http.get("/ShiftWeb/rest/admin/nextsidor")
    .then(function(response) {
    $scope.nextsidor = response.data;
 });

图片:

https://prnt.sc/k5ewd6

2 个答案:

答案 0 :(得分:0)

束缚两个$ http.get操作:

}).controller("nextSidorAdminCtrl", 
   function($scope,$rootScope,$http,$location,$state) {
       $http.get("/ShiftWeb/rest/admin/getallsettingtime")
       .then(function(response) {
           $scope.settingtimes = response.data;
           return $http.get("/ShiftWeb/rest/admin/nextsidor")
       })    
       .then(function(response) {
           $scope.nextsidor = response.data;
       });

由于调用promise的.then方法会返回新的派生promise,因此很容易创建promise的promise。可以创建任意长度的链,并且由于一个承诺可以用另一个承诺来解决(这将进一步推迟其解决方案),因此可以在链中的任何点处暂停/推迟对这些承诺的解决。

有关更多信息,请参见AngularJS $q Service API Reference - chaining promises

答案 1 :(得分:-1)

解决此问题的最佳方法是使用async

在我看来,georgeawg先生的答案是,如果 $http.get("/ShiftWeb/rest/admin/getallsettingtime") 返回success,那么 $http.get("/ShiftWeb/rest/admin/nextsidor") 被称为,否则将不会被调用。

正如我在问题中看到的那样,两者都是独立的。

因此,您需要遵循异步或类似方法的最佳方法。

因此您的代码将是:

 var getAllAettingTime = function(cb) {
      $http.get("/ShiftWeb/rest/admin/getallsettingtime")
      .then(function(response) {
          if(response.data){
                   $scope.settingtimes = response.data;
                    return cb(null,'OK');
          }else{
                    return cb(null,'ERROR');
       })
}

 var nextSidor= function(cb) {
   $http.get("/ShiftWeb/rest/admin/nextsidor")
   .then(function(response) {
          if(response.data){
                   $scope.nextsidor = response.data;
                    return cb(null,'OK');
          }else{
                    return cb(null,'ERROR');
       })
}

async.series([ getAllAettingTime, nextSidor], function(err, result) {
  if (err){
             /* Do what you want if err comes */
  } else {
              /* Do what you want if both HTTP come with success */
   }
});

在上面的 async.series() 中,两个HTTP都将被调用而彼此之间没有任何依赖关系。

为了更好地理解,您需要研究async npm module,并且必须将其安装在您的应用中。