AngularJS 一个控制器中的两个 http 获取问题

AngularJS two http get in one controller make problems

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

 }).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

链接两个 $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;
       });

因为调用承诺的 .then 方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。

有关详细信息,请参阅 AngularJS $q Service API Reference - chaining promises

解决这个问题最好的方法是使用async

在我看来,georgeawg 先生的回答中的问题是,如果 $http.get("/ShiftWeb/rest/admin/getallsettingtime") 将 return 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 并且必须在您的应用中安装。