我试图在Angularjs中执行一个简单的长轮询请求--我提出一个GET请求,它挂起直到服务器响应。然后,我再次提出请求,等待下一个响应,等等。
但是,由于某些原因,代码非常不可靠,错过了从服务器发送的大约80%的响应。
下面是我的代码:
main.messages=[];
...
main.poll=function(){
$http.get('http://localhost:8080/message')
.success(function(data){
console.log(data);
main.messages.push(data);
main.poll();
})
.error(...)
};
有什么明显的东西我在这里错过了吗?
服务器可以检测到浏览器已经连接,服务器确实发送了响应,但是上面的代码没有得到响应(没有控制台输出,也没有错误)。我试着用postman (chrome扩展版)提出这个请求,而长期民意测验在那里非常有效,所以我认为问题就在这里的某个地方。
update:问题只发生在Google上,而且只有在多个选项卡同时执行长轮询时才会出现问题。有一些似乎是随机的行为,创建和关闭新的标签与长期调查。
发布于 2014-11-25 08:03:43
我发现是什么导致了这一切。Chrome一次只会延长一个给定的url选项卡。如果用户打开了多个选项卡请求相同的长轮询,Chrome将在第二个选项卡启动轮询之前等待第一个选项卡中的长轮询结束。
我认为浏览器把长轮询请求看作是“没有响应的服务器”。当您试图在新选项卡中发出相同请求时,浏览器实际上不会再次发出相同的请求以节省资源。如果您查看网络选项卡,它将显示一个挂起的请求。但这是一个“谎言”,浏览器实际上是在等待服务器响应第一个选项卡的请求。一旦从服务器获得第一个选项卡请求的响应,它才会查询服务器第二个选项卡的请求。
换句话说,浏览器(Chrome和Opera)通常不会同时向同一个端点发出两个长轮询请求--即使这些请求来自两个不同的选项卡。
但是,有时在一定时间之后,它也决定释放对第二个选项卡的请求。但我想不出有什么规矩。如果使用相同的请求打开3个选项卡,则关闭前一个选项卡将导致来自其余两个选项卡的两个同时请求。但是,如果打开了6个选项卡,关闭前一个选项卡只会导致3个同时请求,而不是5个。我肯定会有一些规则来控制这种行为,但我想我们必须编写代码,假设请求可能同时发生,或者不同时发生,浏览器可能等待一个请求完成,然后再处理第二个请求。
Safari没有这种行为-它会同时通过多个选项卡发出多个请求。但Chrome和Opera确实显示了这种行为。
因此,与其同时向所有连接的客户端“广播”数据,我现在正在更改代码,使用时间戳来确定客户端需要多少数据,然后发送这些数据。
https://stackoverflow.com/questions/27123860
复制相似问题