论坛首页 Web前端技术论坛

Ajax的本质之A的优势

浏览 3895 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-02-09   最后修改:2009-12-16

先申明一下,我讨厌Ajax这个名词。旧药装新瓶。(像那个80来岁的杨某一样令人讨厌,呵呵)。

正题:

Ajax所谓的异步加载,为何需要异步,可以说异步操作通常都是一个成熟的程序设计人员会尽力回避的东西。复杂度徒增,不好控制,容易出错。

但是,这个问题放在浏览器上就是另外一个情形,浏览器上的脚本+事件通常只有一个线程。那些看是多线程的函数:setTimeout,setInterval,其实都不会插入或中断任何一个其他的在执行中的任务,而且一旦你的脚本尚在运行,那么不管你是否在挂起等待,所有的事件都将阻塞。窗口重画,拖动...也都得靠边站着,感觉就像是某个程序进入一个死循环了。

以前得脚本都是做一些简单得事情,需要得事件,用户基本上都感觉不到,后来XMLHttpRequest的兴起,问题出来了,访问网络资源,你得受网速得限制,如果同步的获取,那你就等吧,等个几秒几分几十分的,不是不可能。这时浏览器可没那么聪明,站旁边傻等,什么窗口重画,移动啊,都装个没听见。

浏览器傻了,用户可不傻,靠,这个网站咋的,吧我的浏览器都搞死了?加入黑名单,或者碰到个脾气好点的,把你辛辛苦苦、没日没夜、绵绵数月敲下来的脚本,一律禁止运行... 傻了把,可怜的脚本程序员。

看似浏览器的问题嘛,可是,谁叫你是中年诸葛亮呢,扶不起的阿斗你也得背着,朽木上xx方显你的出众嘛。于是异步操作遍地开花,第N次世界大乱从此开始。

确实这里使用异步操作很有见成效,先告诉xmlhttp后台加载网络资源。一边凉快凉快,加载完了通知一下。喝喝茶,看看报,N+1秒钟过去了,报告: 001.xml全体元素集合完毕,帐前待命...,ok,..... (机密,隐藏...)。

不错把,你不必焦急的盯着屏幕上所不期望的白大块,不用使劲的失望的拖动着没有的鼠标。你只需要东瞧瞧西瞅瞅,随意的打发点时间,一会,东西准备好了,归你了,爱怎么办就怎么办吧。

没看明白?简单点说吧,就是把资源加载这一操作放在脚本线程之外,那么就不会有长时间运行的脚本,那么用户就觉得你的程序响应快。就是是说ajax,其实asynchronism也就这一个地方而已。

记住一点,浏览器上单纯的脚本程序,本身是不支持多线程的,异步也就无从谈起,而现在所说的异步,都不是纯粹的ECMAScript,都是利用浏览器带有的某些原生对象实现的。

雕虫小技而已,结果吹得鸡毛满天飞。众嘴纭纭之势,众目睽睽之下,公鸡下蛋,鲤鱼上坡,皆有可能。

   发表时间:2007-02-26  
申明一下我不讨厌Ajax这个名词,但很少用Ajax这名词,我讨厌别人动不动就Ajax。

哈哈,楼上的说得有意思。
非常同意jindw的观点

jindw好像是打算把你的那个框架做成支持异步加载类脚本的。
$import.call("new chpn.Test" , /*Array*/ args);
$import.call("chpn.Test.test()",/*Array*/ args);
$import.call("chpn.Test.test()",/*Array*/ args,/*function*/ onReady , /*function*/ onLoading);

$import.call call 方法为重载过的方法。已经不是Function.prototype.call

当调用$import.call时,检查chpn.Test是否已经加载,如果已经加载就立即执行参数1.  chpn.Test.test(参数2).call(chpn.Test)

如果正在加载,则等待。
如果未加载,则发出请求,等待脚本完本加载,就执行数1

参数四 onloading,可以用来实现阻塞用户的操作,比如用一个层使窗口变暗。

这种方法很多情况下都可用
0 请登录后投票
   发表时间:2007-02-26  
chpn 写道
申明一下我不讨厌Ajax这个名词,但很少用Ajax这名词,我讨厌别人动不动就Ajax。

哈哈,楼上的说得有意思。
非常同意jindw的观点

jindw好像是打算把你的那个框架做成支持异步加载类脚本的。
$import.ca............



呵呵,谢谢chpn的建议。
现在还在为1。1忙碌着,1。2还只是计划。
既然你说的这里,我就把计划中的想法说一下。

1.扩展$import函数,增加callback参数,在装载成功后执行。
<script>
function callback(yourFunction){
  youFunction();
}
$import('com.yourcampany.yourFunction',null,youFunction);
</script>

2.增加java.util.ImportManager类。
<script>
$import('js.util.ImportManager');
new ImportManager(['com.yourcampany.Class1','com.mycampany.*']).prepare();
</script>

该方法将用打印预装脚本的方式缓存需导入脚本及其依赖,能后再执行导入操作。其实也是同步,只不过没有事件阻塞的情况。

此外还可以增加一个任务调度的类,在那里可做更加细致的工作,比如让窗口变灰。


这些这是暂时的想法。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics