You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让AngularJS的$resource超时时间突破30秒限制?

AngularJS $resource 超时问题解答

嘿,我来帮你理清这个超时的问题!你遇到的情况很典型,下面分两部分给你解释和解决办法:

一、AngularJS是否有全局最大超时设置?

有的!因为$resource是基于$http实现的,所以可以通过配置$httpProvider来设置全局的请求超时,这样所有的$http$resource请求都会默认使用这个超时时间。

配置示例如下:

angular.module('yourAppName', [])
  .config(['$httpProvider', function($httpProvider) {
    // 设置全局超时为300秒(300000毫秒)
    $httpProvider.defaults.timeout = 300000;
  }]);

如果某个特定请求需要覆盖全局设置,就像你代码里那样,在$resource的方法配置里单独指定timeout即可,局部配置会优先于全局。

二、为什么设置300秒仍会在30秒超时?

你设置的timeout: 300000不生效,大概率不是AngularJS或Chrome的锅,主要排查以下几个点:

1. 后端服务器的超时配置

这是最常见的原因!几乎所有后端服务器(Nginx、Apache、Tomcat、Node.js服务器等)都有默认的请求超时时间,通常在30秒左右。如果服务器在30秒后主动断开了连接,不管前端设置多久的超时,都会触发超时异常。

解决办法:需要调整后端服务器的超时参数,让它允许请求持续更长时间。比如:

  • Nginx可以修改proxy_read_timeout参数;
  • Tomcat可以调整connectionTimeoutkeepAliveTimeout
  • Node.js的Express框架可以设置server.timeout

2. 检查自定义的HTTP拦截器

如果你在AngularJS里配置了$http拦截器,有些拦截器可能会强制修改请求的超时时间,比如统一设置为30秒。需要检查拦截器代码,看是否有覆盖timeout的逻辑。

3. 排除Chrome本身的限制

Chrome 65版本的XMLHttpRequest默认是没有全局超时限制的(默认timeout为0,表示无限制),所以这个可能性很低。你可以写一个简单的测试用例,直接用$http发起请求并设置300秒超时,看是否会在30秒后触发超时,以此排除前端代码的问题。

额外小建议

你的代码里headers中的Auth用了硬编码的'my_token',应该换成传入的token参数,这样才符合函数的设计意图:

var searchResource = function(token) {
  var _url = ['my_url', '/somePAth'].join('');
  return $resource(_url, {}, {
    query: {
      timeout: 300000,
      method: 'GET',
      headers: { Auth: token } // 这里使用传入的token
    }
  });
};

总结

优先检查后端服务器的超时设置,这是导致30秒超时的最可能原因;同时可以通过$httpProvider设置全局超时,或者在$resource方法里单独配置局部超时。

内容的提问来源于stack exchange,提问作者Cherry

火山引擎 最新活动