既然dojo是ajax的一个框架,那异步通信是必不可少的,否则叫什么ajax。dojo中,这一部分是在dojo.io包中的。
  先看看这一段:

 1 // an asynchronous request to foo.php that returns a JavaScript literal
 2 // which is eval()'d
 3 var bindArgs = {
 4     url:        "foo.php",
 5     mimetype:   "text/javascript",
 6     error:      function(type, errObj){
 7         // handle error here
 8     },
 9     load:      function(type, data, evt){
10         // handle successful response here
11     }
12 };
13 
14 // dispatch the request
15 var requestObj = dojo.io.bind(bindArgs);
16 
17 
18 //当然,可以写成
19 //dojo.io.bind({
20 //    url:        "t4.htm",
21 //    mimetype:   "text/javascript",
22 //    error:      function(type, errObj){
23 //        // handle error here
24 //    },
25 //    load:      function(type, data, evt){
26 //        // handle successful response here
27 //    }});
28 

  dojo.io.bind(requestObject)方法中,只有一个参数,就是请求对象,请求对象可以是dojo.io.Request,也可以是指明了dojo.io.Request基本属性的一个匿名对象。在上面的代码中,我们没有new一个dojo.io.Request对象,所以使用的是匿名对象,在应用中,常用的是匿名对象。
  由上面的匿名对象的代码,可以看到dojo.io.Request对象有2个属性和2个方法:
  1."url",表示被请求的资源地址。
  2."mimetype",回应内容类型,默认是"text/plain",注意与http传输时的mimetype区别,当mimetype为"text/javascript"时,表示请求javascript脚本并执行。
  3."error"方法,表示请求失败时的处理。
  4."load"方法,请求成功后的操作。
  dojo.io.Request对象的sync属性默认为false,也就是说不同步(就是异步了),发出请求后,可继续后续操作,就是所谓的异步操作了。一旦该项取值为true,发出请求,则必须等待请求处理完毕,才能继续后续操作,否则将一直阻塞操作。
  上面的代码没有指定sync属性,就是说其为默认值false,所以是异步执行的。
  dojo.io.Request对象还有几个属性,介绍如下:
  method:相信form用多的人都不会陌生,对了,就是和它一个意思,取值为"POST"或"GET",默认取值为"GET"。
  formNode:一个DOM节点,指定一个form将被此次请求提交,其将继承上面的url和method属性,若前面没给method属性赋值,则取该form的method属性。该属性取值如document.getElementById("form1")。
  content:键/值对,将被加在参数里被传输,相当于http传输方式中get和post的数据。
  transport:指明此次传输所用的传输对象,一旦指定的传输对象不可用,则此次请求将失败,同时触发error事件。若不指定,bind()方法将试图从已经注册的传输对象列表中查找最合适的可用的传输对象来执行请求。如要确认用XMLHttp来执行请求,则需指定:transport: "XMLHTTPTransport"。下面是bind()试图查找最合适的传输对象的代码部分:

1 for(var x=0; x<dojo.io.transports.length; x++)
2 {
3     var tmp = dojo.io.transports[x];
4     if((this[tmp])&&(this[tmp].canHandlerequest)))
5     {
6         tsName = tmp;
7     }
8 }

  changeUrl: 请求完成后,发出请求的页面是否将跳转到某锚点。虽然官方文档解释的时候说是boolean类型,默认为false,但是该项也可以是自定义的字符串,就是要跳转到的锚点名称。当该项为true时,锚点名称将根据当前时间生成,具体有什么用处我也不清楚。但是我们可以通过指定锚点名称,来跳转到我们希望的锚点。要注意的是,不管请求处理成功与否,都会发生跳转。官网文档中,说在Mozilla/Firefox中,URL改变将失败,也就有了这句"This may be removed in the future as it pertains exclusively to in-browser HTTP transports.",将来将被去掉,因为与传输对象的结合太专有。例子如下:若该项为true,则跳转地址可能将变为http://192.168.0.168/t3.htm#1144207896421,后面的1144207896421就是根据时间戳产生的,若为:changeURL: "aa",则地址将为http://192.168.0.168/t3.htm#aa。
  useCache:布尔类型,默认为false,表示是否将此次请求的结果缓存,以后直接从缓存中获取此次请求的结果。一旦该项为true后,则发出的请求若为以前发过的,直接从缓存中读取结果。我们可以在bind()执行后,在立刻alert一个东西,当然,要异步执行的。在发出新请求的时候,后面的alert是先执行的,然后执行请求结果。再发出一样的请求后,由于结果在缓存中,所以直接取请求结果,从而我们会看到alert是在执行完结果后,再执行的。
  bindSuccess:布尔类型,默认为false,指明请求是否可以被其它传输对象接受并执行请求。具体用法我也不清楚,以后清楚的时候再补完这里。
  下面说说dojo.io.Request对象的几个方法。
  上面已经讲了error()和load()方法,这里要注意这2个方法的参数。error(type, errorObject)方法有2个参数,第一个参数表示处理结果,在error()中,永远是"error",第二个参数表示的是传输细节。load(type, data, event)有3个参数,第一位也是处理结果,load()中永远取值为"load",表示处理成功,第二位表示处理成功后返回的信息,第三位表示可以处理传输细节的底层传输对象,官网的一个例子是:当利用dojo.io.XMLHTTPTransport进行传输的时候,第三个参数表示的是对执行请求的XMLHTTP对象的一个引用。
  dojo.io.Request对象中,还有2个方法。首先是handle(type, data, event),可以用来处理所有的情况,如load()、error()和其它一些情况。当type=="load"的时候,三个参数和load()是一样的,当type=="error"的时候,data就表示error()中的errorObject,而event就无效了。看下面一个用handle()的例子(摘自官网):

 1 dojo.io.bind({
 2     url: "http://foo.bar.com/sampleData.txt",
 3     handle: function(type, data, evt){
 4         if(type == "load"){
 5             // do something with the data object
 6         }else if(type == "error"){
 7             // here, "data" is our error object
 8             // respond to the error here
 9         }else{
10             // other types of events might get passed, handle them here
11         }
12     },
13     mimetype: "text/plain"
14 });

  由上面,可以很容易明白handle()的用法。
  dojo.io.Request对象中最后一个方法是abort(),字面意思理解是中止请求,是用来中断执行待处理的请求的。这个行为是用来执行请求的传输对象所拥有的。
  在io.js中,可以找到这么一行

dojo.io.transports = [];

  由上面bind()查找最合适的可用传输对象的过程,我们知道,这是用来存放已注册的传输对象的。这是一个数组,里面的传输对象将被每一个bind请求所参考,并且第一个传输对象接受一个特殊请求并处理它(这句由于没找个合适的例子,理解还不够透彻,以后补过)。
  dojo.io.transports有个addTransport(name)方法,是注册一个可用来处理请求的传输对象,要注意的是name是要在dojo.io命名空间中的,如我们常用的dojo.io.XMLHTTPTransport,注册时用dojo.io.transports.addTrasnport("XMLHTTPTransport"),在上面讲dojo.io.Request对象是也说过,要确认用XMLHttp来执行请求,需指定:transport: "XMLHTTPTransport",正好吻合。
  根据上面的资料,transport是可以自己写的,然后定义自己需要的一些东西,具体要怎么写我现在也不清楚,不过个人感觉正如java中的继承那样,能出现相当诱人的结果。

转载于:https://www.cnblogs.com/zxub/archive/2006/04/04/366599.html

DOJO试用手记3--异步通信【原创】相关推荐

  1. 亚马逊AWS云计算平台试用手记(完全原创,我花了2美元第一手试用的珍贵资料,附多图)...

    因为最近在研究云计算服务,所以对目前已经出现的云平台很感兴趣.亚马逊AWS平台(aws.amazon.com)是目前运营最好的收费云计算平台.今日无事,我就去看了看. 和Google App Engi ...

  2. Spire.XLS试用手记

    Spire.XLS试用手记 Spire.XLS是一个.Net操作Excel的组件. 一 首先下载该软件 下载地址 http://www.e-iceblue.com/downloads/spire.xl ...

  3. Fedora 11-Alpha试用手记

    Fedora 11-Alpha试用手记 2003年9月在开发Red Hat Linux 9后续版本(可以称之为  Redhat Linux 10),Red Hat 公司宣布了一项今日决定,他们推出了一 ...

  4. EqualLogic PS5000试用手记

    EqualLogic PS5000试用手记之一:先睹为快 EqualLogic PS5000试用手记之二:出师不利 EqualLogic PS5000试用手记之三:云开见日 EqualLogic PS ...

  5. iphone试用手记

    iphone试用手记 一.购买iphone的原因: 1.想一探究竟到底好在哪里 2.自己手机有点小毛病,也有点旧,也有购买能力,就买了[估计不少人都这个心态] 3.估计还有点自己的小跟风心[这什么心态 ...

  6. 百度云管家提速试用手记 - 几多欢喜几多愁

    百度云管家提速试用手记 - 几多欢喜几多愁 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 ...

  7. 万能五笔6.5绿色美化版试用手记

    大约一年以前的这个时候,我写了封帖子:万能五笔2005输入法平台6.46版---试用手记 : 今天中午,我很好奇的看到了这封文章:万能五笔EXE外挂6.5绿色美化版-闪亮升级! 出于好奇和相信文章中的 ...

  8. Maxthon傲视群雄正式版试用手记(转)

    Maxthon傲视群雄正式版试用手记(转) 据悉我们熟知的多窗口浏览器遨游 Maxthon(前身 MyIE2)在经过了多时的Beta版本测试之后,即将发布正式版!现在程序已经进入RC阶段,所谓RC就是 ...

  9. 《匠人手记》系列原创文章【转】

    来源:http://www.mcublog.com/blog/blog2006/cxjr/archives/2006/19158.html <匠人手记>系列原创文章--匠人的百宝箱

最新文章

  1. 别再问我 new 字符串创建了几个对象了!我来证明给你看!
  2. js监听audio播放完毕
  3. Android开发精要2--Android组件模型解析
  4. 委托、Lambda表达式和事件
  5. led拼接屏报价_LED拼接屏的装饰
  6. mysql 存储过程遍历_Mysql创建存储过程及遍历查询结果
  7. 12-22 挑战留给自己,积极面对
  8. git笔记之解决eclipse不能提交jar等文件的问题
  9. Flutter 内幕:Flutter 在内部是如何工作的?
  10. Nginx for Zabbix 3.2官方监控模板
  11. 禁用AutoCAD的命令
  12. Mathematica 计算矩阵的伴随矩阵
  13. 通过Callable和FutureTask创建线程
  14. 利用JDBC开发图书管理系统
  15. 10个线程同时执行i++操作1000次,如何保证结果是1w
  16. 超级好用的5个免费在线版流程图制作网站
  17. Linux汇编语言开发指南
  18. CDC Comms Interface 设备解决方案
  19. 是时候重估“返利网”的市场价值了
  20. 【组图】世界著名城市夜景

热门文章

  1. python爬虫流程-Python爬虫程序架构和运行流程原理解析
  2. python爬虫流程-Python爬虫流程
  3. 快速记忆python函数-【速学速记】Python的工程化:使用模块
  4. python编程入门到实践 百度云-python网络爬虫从入门到实践pdf
  5. python excel绘图-Python excel 画图
  6. python装饰器-python装饰器是哪个版本支持的
  7. 2!=5 or 0在python中是否正确-python中的or,and运算符
  8. Opengl-光照-基本光照-光照贴图(现在告别单调的方块弄个箱子)
  9. perl导入文本至mysql_Perl 脚本实现MySQL 异机导入导出-阿里云开发者社区
  10. LeetCode Linked List Cycle II(floyd cycle)