Ajax基石脚本异步并发调用参数传递
来源:互联网 发布:windows无法连接到网络 编辑:程序博客网 时间:2024/05/16 15:18
在Ajax开发框架中,最基本的划分是服务器端和客户端。服务器端相对来说比较简单,只要是可以开发动态网页的语言都可以胜任;客户端浏览器就是JScript/JavaScript的天下了,好像没有看到有VBScript做的Ajax客户端库。由于客户端依赖于脚本并运行在浏览器中,似乎比服务器端的可实现和可管理性还要差些。
这里我说一下Ajax中的A, Asynchronous调用的一些问题。如果我们在异步调用时不为方法传递任何的参数,那么这个问题也就简单甚至不存在了。但是事实上,我们开发一些稍微复杂些的功能时,对于"脚本异步并发调用参数传递"这个功能是很需要的。说的严重些,可以把这个功能看成Ajax客户端框架能否真正Asynchronous的基石。对于异步调用参数传递的问题,可以看我以前的一篇文章"使用匿名函数为setInterval传递参数"。虽然文中的示例很好地解决了参数传递问题,但是我们看看下面的示例,看会发现什么呢?
function foo()
{
var param = 100;
window.setTimeout(function()
{
intervalRun(param);
}, 0);
param = 0;
}
function intervalRun(times)
{
alert(times);
}
我们执行foo,会得到什么样的alert结果呢?100? or 0?,答案是:0。其实写过内嵌函数就知道,这里要真确的传入100,需要这样改写foo方法:
function foo()
{
var param = 100;
var __param = param;
window.setTimeout(function()
{
intervalRun(__param);
}, 0);
param = 0;
}// 这样添加一个变量来存储param就可以了,这下执行foo得到的alert结果就是:100。
上面这个修正本身没有问题,可是如果我在并发执行的情况下,就可能又有新的问题。示例代码:
function doTick()
{
var tick = new Date().getTime();
var __tick = tick;
var foo = function()
{
GetTick(__tick);
};
window.setTimeout(foo, 3000);
}
function GetTick(tick)
{
// to do something depend on tick parameter
}
当我们在调用doTick方法时,如果以小于3000ms的频率并发,将会导致前一次的tick变量被后面执行的执行过程修改的问题,从而导致GetTick方法取到错误的tick参数。也就是说必须把doTick方法看成一个,需要"本身执行时间+3000ms"才能运行完的方法,然后再保证并行的执行doTick方法才不会出错。这样的限制条件显然是不可接受的,那么我们该怎么办呢?
其实我们只需要使用内嵌函数自身帮助我们传递参数就行了,修改后的示例如下:
function doTick()
{
var tick = new Date().getTime();
var foo = function()
{
var __tick = foo.params[0];
GetTick(__tick);
};
foo.params = [tick];
window.setTimeout(foo, 0);
}
由于内嵌函数构造出一个Closure Scope,它将帮组我们保存参数的Context,使我们获得真正的"异步并发调用参数传递"效果。
注意:Closure Scope是JScript编程中危险的高级技术,使用不当极易造成IE Memory Leak。
这里我说一下Ajax中的A, Asynchronous调用的一些问题。如果我们在异步调用时不为方法传递任何的参数,那么这个问题也就简单甚至不存在了。但是事实上,我们开发一些稍微复杂些的功能时,对于"脚本异步并发调用参数传递"这个功能是很需要的。说的严重些,可以把这个功能看成Ajax客户端框架能否真正Asynchronous的基石。对于异步调用参数传递的问题,可以看我以前的一篇文章"使用匿名函数为setInterval传递参数"。虽然文中的示例很好地解决了参数传递问题,但是我们看看下面的示例,看会发现什么呢?
function foo()
{
var param = 100;
window.setTimeout(function()
{
intervalRun(param);
}, 0);
param = 0;
}
function intervalRun(times)
{
alert(times);
}
我们执行foo,会得到什么样的alert结果呢?100? or 0?,答案是:0。其实写过内嵌函数就知道,这里要真确的传入100,需要这样改写foo方法:
function foo()
{
var param = 100;
var __param = param;
window.setTimeout(function()
{
intervalRun(__param);
}, 0);
param = 0;
}// 这样添加一个变量来存储param就可以了,这下执行foo得到的alert结果就是:100。
上面这个修正本身没有问题,可是如果我在并发执行的情况下,就可能又有新的问题。示例代码:
function doTick()
{
var tick = new Date().getTime();
var __tick = tick;
var foo = function()
{
GetTick(__tick);
};
window.setTimeout(foo, 3000);
}
function GetTick(tick)
{
// to do something depend on tick parameter
}
当我们在调用doTick方法时,如果以小于3000ms的频率并发,将会导致前一次的tick变量被后面执行的执行过程修改的问题,从而导致GetTick方法取到错误的tick参数。也就是说必须把doTick方法看成一个,需要"本身执行时间+3000ms"才能运行完的方法,然后再保证并行的执行doTick方法才不会出错。这样的限制条件显然是不可接受的,那么我们该怎么办呢?
其实我们只需要使用内嵌函数自身帮助我们传递参数就行了,修改后的示例如下:
function doTick()
{
var tick = new Date().getTime();
var foo = function()
{
var __tick = foo.params[0];
GetTick(__tick);
};
foo.params = [tick];
window.setTimeout(foo, 0);
}
由于内嵌函数构造出一个Closure Scope,它将帮组我们保存参数的Context,使我们获得真正的"异步并发调用参数传递"效果。
注意:Closure Scope是JScript编程中危险的高级技术,使用不当极易造成IE Memory Leak。
- Ajax基石脚本异步并发调用参数传递
- Ajax基石:脚本异步并发调用参数传递
- Ajax基石脚本异步并发调用参数传递
- Ajax基石脚本异步并发调用参数传递
- Ajax基石脚本异步并发调用参数传递
- 艾伟:Ajax基石脚本异步并发调用参数传递
- AJAX——异步请求传递参数
- jQuery之异步Ajax请求使用 通过传递参数来调用后台方法返回状态
- shell调用php脚本,并传递参数
- shell调用php脚本,并传递参数
- shell调用php脚本,并传递参数
- java调用shell脚本并传递参数
- shell调用python脚本,并且向python脚本传递参数
- shell脚本读取文本文件调用其他脚本传递获取参数
- Shell脚本通过参数传递调用指定函数
- java 直接调用python脚本,并传递参数
- jquery ajax 调用web api传递复杂参数
- jquery ajax 调用mvc action传递复杂参数
- MFC教程(8)-- MFC的进程和线程
- JS代码收藏大全
- 《ASP.NET 2.0网站开发技术详解》China-Pub朋友的评论
- JAVA字符集
- 浅谈JSF的生命周期和对ajax处理的影响
- Ajax基石脚本异步并发调用参数传递
- MFC教程(9)-- MFC的进程和线程(1)
- JavaScript中的高级特性及特别对象、属性和方法
- Oracle 10g 安装问题:Microsoft LoopBack Adapter 配置
- 开发保留标准浏览器功能的AJAX应用程序
- 一日一摸之第一日:工厂模式
- bash 杂记
- 利用ThreadLocal记录日志
- linux若干实用命令