既然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. 模态框到阻止冒泡时间
  2. shell脚本中$#、$0、$@等特殊变量的含义
  3. Message Loop 原理及应用
  4. 系列 《使用sklearn进行集成学习——理论》 《使用sklearn进行集成学习——实践》 目录 1 Random Forest和Gradient Tree Boosting参数详解 2 如何调参?
  5. 学习笔记(十八)——MongoDB(CRUD)与Python交互
  6. 【温故知新】HTML学习笔记(下)
  7. 【Python面试】 列举Python中的标准异常类?
  8. CentOS6.5的安装及忘记root密码的措施
  9. [BZOJ2502]清理雪道解题报告|带下界的最小流
  10. 普通类和抽象类有哪些区别?
  11. rxjava 背压_背压加载文件– RxJava常见问题解答
  12. python乐观锁代码实现_Django的乐观锁与悲观锁实现
  13. Use Jet OLE DB Provider 4.0 to Connect to ISAM Databases (连接Excel, Text等数据库)
  14. Android 签名打包
  15. etc fstab 详解linux,Linux下/etc/fstab文件详解
  16. pdf裁边app_PDF裁剪怎么使用?
  17. mybatis-sqlserver批量新增返回id
  18. npm 安装node后,node-v和npm -v提示不是内部或外部命令,也不是可运行的程序 或批处理文件
  19. 基于java的城市公交查询管理系统
  20. ICMP协议(网际控制报文协议)

热门文章

  1. python简单入门代码-Python入门 | IDLE的介绍和使用方法
  2. python爬虫代码1000行-最精简的爬虫 --仅需4行代码(python)
  3. python表白程序-程序员python表白代码
  4. php和python性能-python、node、php、go、java性能对比测试
  5. python输入语句-python2 和 pyhton3 输入语句写法
  6. python小游戏源码-python21点小游戏源码免费下载
  7. python基础教程第三版豆瓣-想学python,请问有没好的书籍推荐?
  8. Linux上整体迁移Anaconda环境,所有的库包、虚拟环境均可用,同时让所有的用户访问
  9. Linux中使用Linux的vim如何让代码高亮显示
  10. 上海理工大学eduroam登陆