如何在AngularJS上获得$ http readyState?

时间:2017-12-09 05:55:29

标签: angularjs angularjs-http

如何获得$ http readyState,使用如下:

var request, interval;

request = $http
  .post('/user/info', {...})
  .success(...);

interval = setInterval(function(){
  if(request.readyState < 3)
    return;

  prepare(request.data, request.headers);
  clearInterval(interval)
}, 10);

function prepare(data, headers){
  ...
}

我不知道如何在不更改angular.js文件的情况下执行此操作。是否可以通过$ httpBackend或其他东西为服务添加一些功能?

1 个答案:

答案 0 :(得分:1)

使用AngularJS 1.5.5,添加了对XHR事件的其他处理的支持:

  

$ http Arguments - Config

     

描述要进行的请求以及如何处理的对象。该对象具有以下属性:

     
      
  • eventHandlers - {Object} - 要绑定到XMLHttpRequest object的事件侦听器。要将事件绑定到XMLHttpRequest上传对象,请使用uploadEventHandlers。处理程序将在$apply块的上下文中调用。
  •   
  • uploadEventHandlers - {Object} - 要绑定到XMLHttpRequest upload object的事件侦听器。要将事件绑定到XMLHttpRequest对象,请使用eventHandlers。处理程序将在$apply块的上下文中调用。
  •   
     

— AngularJS $http Service API Reference - Http Arguments

使用配置对象的eventHandlers属性添加一个获取XHR readyState的事件处理程序:

The DEMO

&#13;
&#13;
angular.module("app",[])
.run(function($rootScope, $http){
  var eventHandlers = {readystatechange: readyStateChangeHandler};
  var config = { eventHandlers: eventHandlers }; 
  $rootScope.messageList = [];
  
  function readyStateChangeHandler(ev) {
    var message = "readyState: "+ev.target.readyState;
    console.log(message);
    $rootScope.messageList.push(message);
  }
  
  $http.get("//httpbin.org/anything",config)
    .then(function(response){
      console.log("OK");
      //console.log(response);
  }).catch(function(response){
      console.log("ERROR");
      //console.log(response); 
  })
})
&#13;
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app">
    <div ng-repeat="m in messageList">
      {{m}}  
    </div>
  </body>
&#13;
&#13;
&#13;