在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异步调用实例
Ajax简单异步调用 Ajax简单异步调用 Ajax简单异步调用
使用ASP.NET AJAX异步调用Web Service和页面中的类方法。 使用ASP.NET AJAX异步调用Web Service和页面中的类方法。 使用ASP.NET AJAX异步调用Web Service和页面中的类方法。
ajax.net异步调用,没有整理的很详细,大家可以参考下的
JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,JQuery,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,ajax,一个关于在js中通过JQuery实现异步无...
jQuery-ajax-用户名异步请求,转载请注明出处:https://blog.csdn.net/qq_40374604(如有需要欢迎留言,我一定会尽快解答)
Ajax无刷新异步调用后台方法获取系统时间显示,简单入门例子
Ajax异步调用框架 程序介绍 不错的代码 共享一下
aJax 异步调用
C#JS AJAX部分代码 用于前后台的数据同步
JQ+ajax实现异步调用 一个简单的小例子
本项目是利用javascript和xml 技术实现对数据的异步调用,页面无刷新!适合出学AJAX的人用!
ajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用xml ajax调用htmlajax调用...
网上有,但是只是介绍,没有现成的代码,现在我做了一个最简单的web服务,在客户端运用AJAX技术进行了调用,测试成功!
Ajax 异步调用 返回数组 返回HashTable 访问Xml jquery
基于Ajax技术的异步搜索引擎研究与实现
包括对JavaScript 在面向对象、DOM 操作方面的扩展、ASP.NET AJAX 客户端组件、ASP.NET AJAX XML脚本等,还介绍了ASP.NET AJAX 框架为开发者在客户端用JavaScript 与服务器端通信而创造的种种便利条件,包括直接调用...
Ajax存在问题就是在异步情况下无法控制什么时候完成记录显示,本人根据回调方法封装了个类,能够将回调方法用参数方式指定,使ajax调用结束后调用回调方法,吧内容传回。ajaxSubmitToDivCallback(显示内容div,提交...
vs2013 利用Ajax+Jquery实现异步进度条效果
ajax 源代码 异步刷新技术