最近搞RTC扩展,需要跨域请求,其实跨域用ajax能正常提交请求,但出于安全限制,无法收到反馈信息,这是关键点,于是设计了个方案。
定义全局队列
queue:[{locked:0,val:undefined}{locked:0,val:undefined},{locked:0,val:undefined}];
元素个数根据前端页面并发确定,用户每个跨域请求必须分配唯一的queue,分配后就标识locked=1,待使用完再标识0;val用于接收返回数据,一般是json数据。
采用在前端页面创建script指向跨域请求页面,返回值应当是js脚本,这里我返回值一般是queue[queueIndex].val=[{id:1,name:"zhangsan"}]的形式。
下面是发起请求:
var script=document.createElement("script");
var queueIndex=helper.getNextQueueIndex();
if(queueIndex<0)
{
alert("当前并发连接过多,请刷新页面或稍后再试!");
return ;
}
script.setAttribute("id","test_script_"+queueIndex);
script.src="http://localhost:8080/Action?action=getDistillLatest&queue="+queueIndex+"&rnd="+Math.random()*9999;
document.body.appendChild(script);
window.setTimeout("helper.listner({queueIndex:"+queueIndex+",workitemNumber:"+workitemId+",action:'getDistillLatest',expireTimes:"+60+"})",500);
调用发送后,定时器执行helper.listner,它用于每隔500毫秒获取一次queue[queueIndex].val,只要不是undefined就证明已经从跨域服务端得到数据。处理完后,需要记得删除脚本,要不然页面出现几十上百个js脚本。
expireTimes这个参数存在的必要性是:有时候服务器报错或其他未知原因,即使几分钟也得不到响应,所以需要设置一个最长等待时间,否则很容易并发过多,客户端页面出现卡的情况。这个方案注意点就是实现helper.listner的时候要细心,检查变量和对象的创建释放,避免产生占用CPU过高和内存溢出现象。
以上是整体思路,方法简单,代码没全部贴,供参考和备用。
定义全局队列
queue:[{locked:0,val:undefined}{locked:0,val:undefined},{locked:0,val:undefined}];
元素个数根据前端页面并发确定,用户每个跨域请求必须分配唯一的queue,分配后就标识locked=1,待使用完再标识0;val用于接收返回数据,一般是json数据。
采用在前端页面创建script指向跨域请求页面,返回值应当是js脚本,这里我返回值一般是queue[queueIndex].val=[{id:1,name:"zhangsan"}]的形式。
下面是发起请求:
var script=document.createElement("script");
var queueIndex=helper.getNextQueueIndex();
if(queueIndex<0)
{
alert("当前并发连接过多,请刷新页面或稍后再试!");
return ;
}
script.setAttribute("id","test_script_"+queueIndex);
script.src="http://localhost:8080/Action?action=getDistillLatest&queue="+queueIndex+"&rnd="+Math.random()*9999;
document.body.appendChild(script);
window.setTimeout("helper.listner({queueIndex:"+queueIndex+",workitemNumber:"+workitemId+",action:'getDistillLatest',expireTimes:"+60+"})",500);
调用发送后,定时器执行helper.listner,它用于每隔500毫秒获取一次queue[queueIndex].val,只要不是undefined就证明已经从跨域服务端得到数据。处理完后,需要记得删除脚本,要不然页面出现几十上百个js脚本。
expireTimes这个参数存在的必要性是:有时候服务器报错或其他未知原因,即使几分钟也得不到响应,所以需要设置一个最长等待时间,否则很容易并发过多,客户端页面出现卡的情况。这个方案注意点就是实现helper.listner的时候要细心,检查变量和对象的创建释放,避免产生占用CPU过高和内存溢出现象。
以上是整体思路,方法简单,代码没全部贴,供参考和备用。