Ajax基石脚本异步并发调用参数传递

    在Ajax开发框架中,最基本的划分是服务器端和客户端。服务器端相对来说比较简单,只要是可以开发动态网页的语言都可以胜任;客户端浏览器就是JScript/JavaScript的天下了,好像没有看到有VBScript做的Ajax客户端库,就算它只支持IE。由于客户端依赖于脚本并运行在浏览器中,似乎比服务器端的可实现和可管理性还要差些。

    这里我说一下Ajax中的A, Asynchronous调用的一些问题。如果我们在异步调用时不为方法传递任何的参数,那么这个问题也就简单甚至不存在了。但是事实上,我们开发一些稍微复杂些的功能时,对于"脚本异步并发调用参数传递"这个功能是很需要的。说的严重些,可以把这个功能看成Ajax客户端框架能否真正Asynchronous的基石。对于异步调用参数传递的问题,可以看我以前的一篇文章"使用匿名函数为setInterval传递参数"。虽然文中的示例很好地解决了参数传递问题,但是我们看看下面的示例,看会发现什么呢?

None.giffunction foo()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
var param = 100;
InBlock.gif    window.setTimeout(
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        intervalRun(param);
ExpandedSubBlockEnd.gif    }
0);
InBlock.gif    param 
= 0;
ExpandedBlockEnd.gif}

None.gif
None.gif
function intervalRun(times)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    alert(times);
ExpandedBlockEnd.gif}

    我们执行foo,会得到什么样的alert结果呢?100? or 0?,答案是:0。其实写过内嵌函数就知道,这里要真确的传入100,需要这样改写foo方法:
None.giffunction foo()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
var param = 100;
InBlock.gif    
var __param = param;
InBlock.gif    window.setTimeout(
function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        intervalRun(__param);
ExpandedSubBlockEnd.gif    }
0);
InBlock.gif    param 
= 0;
ExpandedBlockEnd.gif}
// 这样添加一个变量来存储param就可以了,这下执行foo得到的alert结果就是:100。

    上面这个修正本身没有问题,可是如果我在并发执行的情况下,就可能又有新的问题。示例代码:
None.giffunction doTick()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
var tick = new Date().getTime();
InBlock.gif    var __tick = tick;
InBlock.gif    
var foo = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        GetTick(__tick);
ExpandedSubBlockEnd.gif    }
;
InBlock.gif    
window.setTimeout(foo, 3000);
ExpandedBlockEnd.gif}

None.gif
None.gif
function GetTick(tick)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// to do something depend on tick parameter
ExpandedBlockEnd.gif
}

    当我们在调用doTick方法时,如果以小于3000ms的频率并发,将会导致前一次的tick变量被后面执行的执行过程修改的问题,从而导致GetTick方法取到错误的tick参数。也就是说必须把doTick方法看成一个,需要"本身执行时间+3000ms"才能运行完的方法,然后再保证并行的执行doTick方法才不会出错。这样的限制条件显然是不可接受的,那么我们该怎么办呢?

    其实我们只需要使用内嵌函数自身帮助我们传递参数就行了,修改后的示例如下:
None.giffunction doTick()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
var tick = new Date().getTime();
InBlock.gif    
var foo = function()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
var __tick = foo.params[0];
InBlock.gif        GetTick(__tick);
ExpandedSubBlockEnd.gif    }
;
InBlock.gif    foo.params 
= [tick];
InBlock.gif    window.setTimeout(foo, 
0);
ExpandedBlockEnd.gif}

    由于内嵌函数构造出一个Closure Scope,它将帮组我们保存参数的Context,使我们获得真正的"异步并发调用参数传递"效果。

    注意:Closure Scope是JScript编程中危险的高级技术,使用不当极易造成IE Memory Leak。

转载于:https://www.cnblogs.com/birdshome/archive/2006/03/10/Ajax_Base.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab disteclud,机器学习实战ByMatlab(3)K-means算法

K-means算法属于无监督学习聚类算法,其计算步骤还是挺简单的,思想也挺容易理解,而且还可以在思想中体会到EM算法的思想。K-means 算法的优缺点:1.优点:容易实现2.缺点:可能收敛到局部最小值,在大…

【Mininet】使用l2_multi模块寻找最短路径实验

实验参考: 使用l2_multi模块寻找最短路径实验 实验步骤: comming soon... 转载于:https://www.cnblogs.com/ptolemy/p/11256021.html

智能安全实验室-Defendio杀马2.4.0.420-实时防护-内存防护、新浏览器导航界面...

智能安全实验室-杀马(Defendio) 2.4.0.420 :实时防护-内存防护、新浏览器导航界面等 详细信息请访问:http://unruledboy.cnblogs.com/archive/2006/02/02/Defendio.html怎样获取最新版本?□智能更新:打开现…

mysql5.7空间运算,深度解析MySQL5.7之临时表空间

临时表临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。临时表有下面几种:1、全局临时表这种临时表从数据库实例启动后开始生效,在数据库实例销毁后…

【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况...

模板下载: 链接:https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw 提取码:6aox 1、MDK使用MDK5.26及其以上版本。 2、IAR使用IAR8.30及其以上版本。 3、教程直可以先看之前发布的,除了新增的一些功能,其它功能基本…

难忘的考研岁月

难忘的考研岁月 ——代腾飞 昼夜周而复始地轮回,太阳每天更新着光辉,当时光平平仄仄地走过一段长长的路途,许多异彩纷呈的心绪已在不断怀想中清淡成渐行渐远的 风景抑或无足轻重的点缀。唯有那铭心刻骨的考研岁月未被崭新的氛围和徒劳的奔波所…

自动图片轮播php源码,js实现自动图片轮播代码

本文实例为大家分享了轮播的具体代码,自动轮播,居中显示,供大家参考,具体内容如下#div1{width: 192px;height: 120px;border: 1px solid gray;margin: 0 auto;position: relative;overflow: hidden;}#div1 img{position: absolute…

【Open vSwitch】Open vSwitch使用案例扩展实验

实验参考: Open vSwitch使用案例扩展实验 实验步骤: 1. 实验任务一。 1.创建新文件ovsSingleBr.py并编辑以下内容: 1 #!/usr/bin/python2 3 from mininet.net import Mininet4 from mininet.node import Node5 from mininet.link import Lin…

php里面的 n算是,用PHP中的bcmath计算第N个根

好吧,似乎PHP和BC lib有一些限制,在网上搜索后我发现这个interesting article/code:所以你应该使用这个功能&#xff1a;function NRoot($num, $n) {if ($n<1) return 0; // we want positive exponentsif ($num<0) return 0; // we want positive numbersif ($num<2)…

【Open vSwitch】Open vSwitch的GRE隧道实验网络

实验参考&#xff1a; Open vSwitch的GRE隧道实验网络 实验步骤&#xff1a; 1. 配置VM: 1. 本次要实现的拓扑如下&#xff1a; 先验证虚拟机VM1的OvS服务是否被启动好&#xff1a; 2. 在VM1中创建两个bridge&#xff1a; 1 # ovs-vsctl add-br br0 2 # ovs-vsctl add-br br1 3…

电子政务项目风险管理(上)

风险管理是项目管理中非常重要的环节。电子政务项目由于受到政府预算体系、领导个人意志、层层审批决策机制以及实施方对政府业务特点把握能力等多种客观因素的影响&#xff0c;风险种类更多&#xff0c;如果不能很好地进行管理&#xff0c;会对整个项目的进展造成严重影响&…

php web音视频通话,实现音视频通话(Web)

实现音视频通话(Web)网易云信音视频通话产品的基本功能包括高质量的实时音视频通话。当您成功初始化 SDK 之后&#xff0c;您可以简单体验本产品的基本业务流程。本文档为您展示音视频通话提供的基本业务流程。前提条件请确认您已完成以下操作&#xff1a;快速跑通Sample Code注…

【Open vSwitch】Open vSwitch的VxLAN隧道网络实验

验参考&#xff1a; Open vSwitch的VxLAN隧道网络实验 实验步骤&#xff1a; 1. 预先配置: 1. 验证两虚拟机的OvS服务是否被启动好&#xff1a; # ps –ef|grep ovs 2. 登陆两台安装Mininet的虚拟机&#xff0c;分别查看IP地址&#xff1a; VM1&#xff08;192.168.0.102&#…

centos oracle创建库,CentOS Oracle安装必要的软件创建数据库

CentOS Oracle安装系统的特性&#xff0c;既可作为高校计算机专业CentOS Oracle安装学习&#xff0c;也可以作为CentOS系统开源爱好者、CentOS系统用户CentOS Oracle安装系统的特性&#xff0c;&#xff0c;既可作为高校计算机专业CentOS Oracle安装学习&#xff0c;也可以作为…

(转载)windows server 2003的注意事项

Windows Server 2003需要注意的地方Windows Server 2003分为4个版本&#xff1a;标准版、企业版、Datacenter 版和 Web版&#xff0c;对硬件系统的最小要求为&#xff1a;最小CPU速度 133MHz&#xff0c;推荐CPU速度 550MHz最小内存要求 128M&#xff0c;推荐最小内存 256M安装…

【Open vSwitch】Open vSwitch流表应用实战

实验参考&#xff1a; Open vSwitch流表应用实战 如何在ubuntu系统下搭建一个opendaylight Beryllium版本环境 实验步骤&#xff1a; 1. 前期准备。 1.创建2个虚拟机&#xff0c;一个是选择OpenDaylight镜像的虚拟机作为控制器&#xff08;注&#xff1a;内存大于2G&#xff09…

oracle sql loop merge,Oracle之存储过程和MERGE INTO语句

一、MERGE INTO语句1、merge into语句的功能&#xff1a;我们操作数据库的时候&#xff0c;有时候会遇到insert或者Update这种需求。我们操纵代码时至少需要写一个插入语句和更新语句并且还得单独写方法效验数据是否存在&#xff0c;这种操作完全可以用merge into语句代替&…

七月暴雨

狼是弱者 是生命无从着落的弱者 是黯然神伤的异族 它们此刻在星光月夜里 悲情地凝望厮守缠绵过的故园 在逡巡的感伤里作别 为了生命 为了延续 选择死亡或者选择离去 就像时间无意从指间滑过一样 悄悄的溜走 没有…

【OpenFlow】OpenFlow1.3协议基于Mininet部署与验证

实验参考&#xff1a; OpenFlow1.3协议基于Mininet部署与验证 实验步骤&#xff1a; 1. 安装mininet&#xff0c;具体步骤请看实验参考。 2. Mininet创建拓扑后连接支持OpenFlow1.3的控制器&#xff1a; 在连接前&#xff0c;可以通过命令确认控制器的端口号&#xff1a; 3. 进…