动态创建script实现跨域请求和接受返回值

最近搞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过高和内存溢出现象。
以上是整体思路,方法简单,代码没全部贴,供参考和备用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值