如何让AngularJS的$resource超时时间突破30秒限制?
嘿,我来帮你理清这个超时的问题!你遇到的情况很典型,下面分两部分给你解释和解决办法:
一、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可以调整
connectionTimeout和keepAliveTimeout; - 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




