1.如何实现一个轮询?

function getMessage(url,callback){
var XHR=new XMLHttpRequest();
XHR.open('get',url,true);
XHR.onreadystatechange=function(){
if(XHR.readyState==4){
//do something
if(callback){
callback(XHR.responseText);
}
}
};
XHR.send();
setTimeout(function(){getMessage(url,callback),2000);//采用递归的方式达成轮询效果
}
setTimeout(function(){getMessage(url,callback),2000);//采用递归的方式达成轮询效果

缺点:对于即时发送即时得到结果的短轮询,这是一种不错的选择,但是如果服务器不会立即响应请求,那就会产生不好的效果,是请求堆积,给服务器增压。
2.所以长轮询应运而生

function getMessage(url,callback){
var xhr=new XHRHttpRequest();
xhr.open('get',url,true);
xhr.onreadystatechange=function(){
if(xhr.readyState==4){
//do something
if(callback){
callback();
}
xhr.open('get',url,true);
xhr.send();//这里完成了循环过程
}
};
xhr.send();
}

setTimeout(function(){getMessage(url,callback);},2000);

这样的轮询方式解决了短轮询那样无休止的发送请求,而是改为只要服务器搭理我并给我返回数据,我才会继续轮询。
3.JSONP或callback轮询

无论是长轮询或段轮询都不能跨域进行数据请求,所以JSONP轮询应运而生。

function getMessage(url,callback){
var oScript=document.createElement('script');
oScript.src=url+'?callback=getMessage.callback';
getMessage.callback=function(data){
callback(data);
getMessage(url,callback);//递归调用完成轮询过程
}
document.getElementsByTagName('head')[0].appendChild(oScript);
}

声明:这些轮询技术不可避免的问题就是增加服务器CPU的负担,虽然Comet服务器会优化HTTP/线程/进程,但是不会优化套接字的规模数,这些都会给服务器造成不可预知的问题,所以还要使用替代技术做一些优化,从而避免套接字的检查。

最新文章

  1. 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
  2. Pandas-数据探索
  3. HDU 1423 Greatest Common Increasing Subsequence
  4. java.lang.ArithmeticException: / by zero
  5. python 读取utf8文件
  6. [转]SHSH, APTicket以及iOS降級
  7. SDN第5次上机作业
  8. Linux下的指令:tail
  9. AsyncTask还要知道的一些知识
  10. 解析xml文件 selectSingleNode取不到节点
  11. Centos6.5安装mariadb的坑坑
  12. 从网上整理的一些delphi字符串加密解密方法
  13. u-boot移植(四)---修改前工作:代码流程分析3---代码重定位
  14. Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
  15. shell script 脚本编程
  16. anu - children
  17. BugFree3.0.4Linux环境安装指南
  18. CTreeCtrl 父结点联动子结点CheckBox
  19. 基于Extjs的web表单设计器 第一节
  20. fir分布式滤波的fpga实现

热门文章

  1. python内建函数-数字相关
  2. 5.css字体
  3. 5.html5中的路径表示
  4. Python学习教程(learning Python)--1.2.3 Python格式化输出百分比
  5. word中让首页和目录不显示页码的方法
  6. java 网页页面抓取标题和正文
  7. .NET开源工作流RoadFlow-流程设计-流程属性设置
  8. 基于Elasticsearch开发时的注意事项备忘
  9. supplicant
  10. MySQL 触发器简单实例