search

Home  >  Q&A  >  body text

javascript - Ajax实现的长轮询如何才能不阻塞同一时间内页面的其他Ajax请求(同域请求)呢?

长轮询的实现是用xmlhttprequest递归得到的,页面一旦加入了这种轮询方式,其他地方的ajax请求就没反应了,比如滚动到页底自动加载新文章。查了资料,据说HTTP 1.1是不允许同一时间客户端向同一服务器建立2个http连接。如何解决?

伊谢尔伦伊谢尔伦2846 days ago567

reply all(6)I'll reply

  • ringa_lee

    ringa_lee2017-04-10 14:42:56

    据说HTTP 1.1是不允许同一时间客户端向同一服务器建立2个http连接

    这个说法不对

    实际上是不能并发访问同一个站点使用了session的页面,因为访问A页面时,session被锁住了,B页面要等A页面结束释放锁才能被执行。解决方法就是不用session,或者session使用后立刻释放(php 使用session_write_close释放session锁)

    回过一次了,再回一次

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 14:42:56

    直接终止轮询返回当前结果(轮询结果,可能为空),发起其他地方的ajax请求,得到结果,然后再开个轮询呗(可能我这想法太naive了),或者改需求哈哈。

    其实用轮询的方式实现server push(一般都是这个作用吧?),不如用socket,不过好像其标准还不是太清晰。具体请google,对了昨天还看到个有人分享的文章:消息推送机制技术设计

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 14:42:56

    递归一个LongPolling,在开启第二个请求时,第一个请求的连接已经被关闭了。那实际上就还有一个可用的通道。只要保证后端对应的数据服务返回足够快,那么一个信道也可以不block。

    至于别的方案么,绕个圈子JSONP,Flash XML Socket/Websocket,某些Ajax放在别的域下,然后配置server的CORS,或者iframe什么的。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:42:56

    讲一下ifame的数据提交方式

    用iframe实际上是用form提交数据的方式,把数据提交给一个iframe,然后返回一个页面在iframe中,页面中是一段js代码
    例如

    <script type="text/javascript">
    
        window.parent.method(data);
    
    </script>
    

    用这种方式把数据提交到后台进行处理,在低版本浏览器中,通常使用此方法,上传图片

    在当前页面中,要在window对象下定义一个全局对象或方式,可以使用window.parent来调用此方法

    使用iframe来提交数据,要与后端进行约定,在前端所执行的js方法。 一般数据提交不建议使用iframe方式。还是ajax较为方使

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:42:56

    能不能把长轮询改下请求方式,在客户端使用js定时去请求服务器端,服务器端设置响应的时间。到了设置的时间就去响应。仿照队列,前后端都排好队。先来的先服务。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:42:56

    不太明白,我这里并没有碰到这样的问题。我一个页面有多个ajax数据载入,有一个是实现服务器PUSH消息的,一直在阻塞中,但是我在这个时候,去点击其他ajax请求,都得到了返回数据。这个客户端应该都是一样的,而且与服务端差异的因素也不大吧。虽然我用的是java的服务器端,这是AJAX机制的问题。应该都是一样的。

    reply
    0
  • Cancelreply