Angularjs'$ http.get只在IE11中执行一次

时间:2014-02-05 21:20:32

标签: javascript angularjs internet-explorer-11

我正在学习angularjs,作为一个测试项目,我正在轮询一个服务器,该服务器返回一个活动进程列表(它们的pid)并显示这些进程。

客户端代码如下所示:

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="static/angular/angular.js"></script>
    <script>
      function ProcessCtrl($scope, $http, $interval) {
        $scope.ReloadData = function() {
          var result = $http.get("processdata", {timeout:1000});
          result.success(function(data,status,headers,config) {
            $scope.processes = data;
          });
        }
        $scope.ReloadData();
        var stop = $interval(function(){$scope.ReloadData()}, 1000);
      }
    </script>
  </head>
  <body ng-app>
    <div ng-controller="ProcessCtrl">
      Processes:
      <ul>
        <li ng-repeat="process in processes">
          {{process.pid}} is running
        </li>
      </ul>
    </div>
  </body>
</html>

这适用于Firefox和Chrome,但不适用于Internet Explorer 11。

所有浏览器每秒都执行一次ReloadData方法,但IE11实际上并没有从服务器获取进程数据。 Firefox和Chrome确实每秒都会获取数据。我也可以在我的服务器的输出中看到这一点,该服务器记录每个请求。

所有三个浏览器都执行result.success中的代码,但IE11不断重复使用它第一次获得的旧数据,其中FireFox和Chrome使用新获取的数据。

我已经在IE11中检查了Web控制台是否有警告或错误,但没有。

修改 正如所选答案所暗示的那样,这是一个缓存问题。我让服务器添加了一个&#39;缓存控制&#39;使用值&#39; no-cache&#39;来标记响应。这解决了这个问题。

2 个答案:

答案 0 :(得分:8)

请求可能会被缓存,因为它对缓存GET请求有效。由于运行开发工具或其他原因,FF和Chrome可能已禁用缓存。您可以将时间戳附加为url查询字符串"processdata?" + (new Date()).getTime(),以查看它是否是缓存问题。

可以在此处找到更好的防止IE缓存的方法: Angular IE Caching issue for $http

答案 1 :(得分:0)

我更喜欢使用$ http.post来阻止任何缓存。