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.缺点:可能收敛到局部最小值,在大…

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

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

【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…

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

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

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

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

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

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

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

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

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

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

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

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

七月暴雨

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

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

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

【OpenDaylight】OpenDaylight的C/S模式实验

实验参考: OpenDaylight的C/S模式实验 实验步骤: 1. 启动OpenDaylight: 查看是否开启: 或: 2. 查看OpenDaylight的IP地址: 3. 用Miniet创建简易拓扑并连接ODL: 4. 在OpenDaylight虚拟机上查看监…

linux vnc 改端口号,基于Linux中vnc配置端口号的修改方法

vnc的默认端口是自己配置的,并不是这有一个端口号。通过打开/etc/sysconfig/vncservers。 这里就配置了2个桌面,一个桌面号是1, 一个是2.这里的配置的参数VNCSERVERS"2:root"VNCSERVERARGS[2]"-geometry 1280x800"就可以…

linux怎么查看本地磁盘空间,linux怎么查看磁盘空间

如果你在使用Linux过程中遇到无法读写磁盘,应用程序无法执行,请求响应不了等问题,那多半是Linux系统磁盘空间满了,那么怎么查看Linux磁盘空间呢?下面跟着学习啦小编一起来了解一下吧。linux怎么查看磁盘空间首先如果需要查看整个…

[hdu5629]Clarke and tree

首先由一个神奇的序列叫做Purfer序列,他可以表示一棵树,且每个节点出现此时为度数-1(因此总长为n-2)。 然后dp,用f[i][j][k]表示用前i个点中的j个点构成了一个长度为k的Purfer序列(当然要符合条件),那么有$…

linux指令与数据库,Linux指令每日背诵(第一天)

了解:Linux 命令的分类:内部指令、外部指令。Shell 在用户和内核之间充当了“翻译官”的角色。掌握:四种指令方式:1、命令字;2、命令字选项;3、命令之参数;4、命令字选项参数;命令字…

Scott Mitchell 的ASP.NET 2.0数据教程之五:: 声明参数

导言 在上一章的教程中,我们看了GridView、DetailsView和FormView绑定到OjbectDataSource控件显示数据,ObjectDataSource调用了类ProductsBLL的GetProducts()方法。方法GetProducts()返回一个有Northwind数据库的Products表的所有记录组成的强类型数据表…

IArea

用于获取一个几何对象的面积 IArea接口的第一个属性Area(只读,返回一个double类型的数值,为此Area的面积)IArea接口的第二个属性Centroid(只读,返回一个IPoint类型的变量,为此Area的重心&#x…