【问题标题】:Angular $http return confused responseAngular $http 返回混淆响应
【发布时间】:2016-07-30 21:06:24
【问题描述】:

我在 Codeigniter 中创建了 RESTapi,到目前为止工作正常。但是今天,当我通过 Angular 调用 API 时,返回的数据完全混乱。我不是第一次使用角度,但现在我不明白我在哪里做错了。 我得出的结论是问题出在角度,因为当我从“邮递员”发送请求时,结果就是我所期望的。

我的 Angular 控制器是这样的:

.controller('adminCtrl', function($http, $q, NgTableParams) {
  var vm = this;
  var deferred = $q.defer();
  vm.selected = {};

  sendHttpRequest = function(req) {
    $http(req).success(function successCallback(response, status) {
        deferred.resolve(response);        
      })
      .error(function errorCallback(error) {
        deferred.reject(error);
      });
    return deferred.promise; 
  };

  vm.editGame = function(game) {
   vm.selected = angular.copy(game);
  };

  vm.reset = function () {
    vm.selected = {};
  };

  vm.getTemplate = function(game) {
   if (game.gameId === vm.selected.gameId){
    return 'edit';
   }
   else return 'display';
  };

  vm.save = function(idx) {
    
    var updateData = {
      method: 'POST',
      url: "<?php echo base_url('api/updateResult'); ?>",
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'X-API-KEY': "<?php echo $userInfo['API_Key']; ?>"
      },
      data: {
        'gameId': vm.selected.gameId, 
        'homeSaves': vm.selected.homeSaves,
        'awaySaves': vm.selected.awaySaves
      }
    }; 
    console.log(updateData);
    sendHttpRequest(updateData).then(function(x) {  
      console.log(x);
      vm.games[idx] = angular.copy(vm.selected); 
      vm.reset();
    }, function(error) {
      swal({   
        title: "Error!",   
        text: error,
        type: "error",   
        confirmButtonText: "OK!",   
        closeOnConfirm: true 
      }, function() { 
        vm.reset();
        //window.location.href = "<?php echo base_url(); ?>";
       });
    });  
  };
  
 
  var getData = {
    method: 'GET',
    url: "<?php echo base_url('api/result'); ?>",
    headers: {
      'X-API-KEY': "<?php echo $userInfo['API_Key']; ?>"
    }
  };

  sendHttpRequest(getData).then(function(data) {  
    _.forEach(data, function(o) {
      o.homeSaves = parseInt(o.homeSaves);
      o.awaySaves = parseInt(o.awaySaves);
    });
    vm.games = data;
  }, function(error) {
    swal({   
      title: "Error!",   
      text: error,
      type: "error",   
      confirmButtonText: "OK!",   
      closeOnConfirm: true 
    }, function() { 
      window.location.href = "<?php echo base_url(); ?>";
     });
  });


});

它是一些运动结果的内联编辑器。 当APP启动时,我们调用sendHttpRequest(getData),效果很好。如果我尝试通过更改请求中的url来模拟错误,则会返回错误函数,并且“swal”会显示错误。

问题出在 vm.save 函数中。如果我用所有正确的参数调用它,数据将毫无错误地保存在我的数据库中。但是,如果我尝试通过更改 url 或通过 RESTapi 控制器强制返回错误来模拟错误,则返回的结果会很混乱。
代替函数(错误),函数(x)将被执行并打印完全错误的结果(vm.games的结果),甚至在我将url更改为错误或400/500的例子中REST返回405 Method Not Allowed,当我强制REST控制器时返回错误。

【问题讨论】:

  • 尝试将var deferred = $q.defer(); 放入sendHttpRequest 函数中?或者你可能一直在使用第一个请求已经解决的承诺。
  • var deferred = $q.defer(); 放入 sendHttpRequest 解决问题 :) thnx man。我怎么给你点赞?
  • 复制粘贴我的答案:D

标签: angularjs


【解决方案1】:

试试把 var deferred = $q.defer();在 sendHttpRequest 函数中。

或者你总是使用第一个请求解决的承诺。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2020-12-29
    相关资源
    最近更新 更多