DOJO试用手记3异步通信【原创】

  既然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/p/366599.html