Ajax(Asynchronous JavaScript and XML)
我没有能力给Ajax下定义,但看到的所谓的ajax应用却让我很是困惑。就上面的这个名词,Asynchronous放在了首位,我知道不该咬文嚼字,这里我只想说说,异步操作我们真的能正确的使用吗?
一、异步由来
XMLHttpRequest这个对象的open方法有个参数可以确定这次请求是同步还是异步操作,如果是同步操作,相当于函数调用一样,没什么问题。如果选择异步,那么必须监听该对象的变化状态来得到结果。
一般编程都是同步模型,例如调用一个方法,如果这个方法需要很长时间,也的等,一般也不会出现什么问题。异步模型偶只在JMS中用过点点,你发个消息,不用等消息发送成功与否,程序继续执行(可能消息接受者没收到,可能以后会收到)。这样看来异步操作也有用,但应该是在特定情况下。
二、ajax框架的不负责任
以prorotype.js为首,Ajax.Request 对同步(synchronous)请求的支持一直有bug(现在改了),估计作者眼中,ajax都是异步操作,但我们使用者呢,无形中给我们这种思想。
dwr,典型异步操作,让我们自己维护callback,代码丑陋,难于控制,还可能会出问题。http://agile.com/read.php?tid=232
dojo.io/qooxdoo.......
我不知道这些框架实现者中,ajax都是异步操作吗?下面我就来说说看!
三、案例分析
1、google maps
ajax御用例子,整个应用确实是异步的,异步的请求图片。请注意,这里的异步形成是根据<img>对象可以”自动“加载图片来实现的,并且也没有回调方法。
如果你说google maps之类的应用使用ajax的异步操作,我觉得不是很准确。
2、google mail
不停的点击收件箱,可以看到页面右上角那个 正在加载.......
我估计用的是异步操作,但这里我看不错异步操作能带来什么好处,但服务器的压力是加大很多。
你也可以点击收件箱,然后F5。看到有很多请求被别的请求”覆盖了“。(可能f5不是很合适)
也可以乱点,相信你很快就和我一样,gmail出现异常了,不让访问了。
我不认为web mail中的有些操作适合异步操作。
3、google suggest
我认为它是很适合异步操作的。为什么呢,因为这里需要”覆盖请求“。例如我期望得到 Chinese。我输入 chi 这时候可能就向服务器发送请求了,可还没有返回,也有可能已经返回一些建议了。我还会输入下去,也可能输错,删除几个单词。(这样说下去就复杂了) 但无论怎么样,最后一个请求的结果是用户希望看到的,前面的所有请求只是可能的最终结果,所以我觉得web”请求覆盖“是异步操作的主要标志之一。
四、从软件应用类型分析
ajax in action让偶接触的软件可用性。[emot]grin[/emot]
transient(瞬态的)/sovereign(独占的) 的使用方式。从字面上相信都清楚了。这里我不想详细说了,大家可以看看ajax in action体会一下,讲了也不多,但能启发你。
是否异步操作与它们有很大关系。
五、怎么样确定异步还是同步
如果你和我同样的考虑以后,相信我们面对的太多应用,或者用例都应该是同步操作(当然异步也可以实现)。如果你习惯了用ajax的异步通信,那赶快改过来吧,同步模型会让你的软件更稳定,开发更简单。
相信我,大家的很多时候都滥用的异步操作!
当然异步带来的好处也很多,给软件的可用性,用户体验提升是巨大的,可困难也是巨大的。
六、总结
我们大部分的web应用都是同步操作,也习惯了点击触发一个事件,等待它完成的习惯。
异步操作能带给我们很多想象之外的效果,但绝对不是代替同步操作。