Dojo book第一章补充 I/O

译者序:
Dojo book目前还在不断更新和补充中,我会尽量跟上原著的脚步,给大家最新的信息。
更新我会用随笔写出来,同时也会更新原文章。

I/O

dojo.io.blind介绍


在我们制作dojo的时候,目的是让用户和开发者都能享受到DHTML程序。在很多朋友的支持下,特别是Aaron Boodman和Mark Anderson,我们已经找到了解决可用性的方法。我们提供了一个单独的易用的API和一个包装类,这个类只需要两个文件。dojo.io包提供了对XMLHTTP和一些其他更复杂的传输结构的支持。

在dojo.io 包中我们一般最常使用的是dojo.io.bind()方法。dojo.io.blind()是一个标准的异步的请求API,它包含了各种传输层 (transport layers),包括queues of iFrames,XMLHTTP,mod_pubsub,LivePage等等。Dojo会试图为当前的请求选择最合适的传输方法,因为在做网站时一般不 会使用到其他传输,所以我们只用到XMLHTTP。dojo接受一个匿名的类,但是在知道这个类的属性的情况下,把它作为方法参数(function argument)。下面的代码是创建一个请求(request),这个请求会从URL返回原始的字符串。
dojo.io.bind({
    url: 
" http://foo.bar.com/sampleData.txt " ,
    load: 
function (type, data, evt){  /* do something w/ the data  */  },
    mimetype: 
" text/plain "
});

这就是全部,你提供了一个数据地址,还有一个当你得到返回值时要执行的function。但是如果在请求过程中出错了怎么办呢?我们再来创建一个register来解决:

dojo.io.bind({
    url: 
" http://foo.bar.com/sampleData.txt " ,
    load: 
function (type, data, evt){  /* do something w/ the data  */  },
    error: 
function (type, error){  /* do something w/ the error */  },
    mimetype: 
" text/plain "
});

同样也可以只创建一个单独的handler来解决:
dojo.io.bind({
    url: 
" http://foo.bar.com/sampleData.txt " ,
    handle: 
function (type, data, evt){
        
if (type  ==   " load " ){
            
//  do something with the data object
        } else   if (type  ==   " error " ){
            
//  here, "data" is our error object
             //  respond to the error here
        } else {
            
//  other types of events might get passed, handle them here
        }
    },
    mimetype: 
" text/plain "
});

下面的代码提交一段javascript程序段,然后让服务器运行它,一般我们这么做是为了加速程序运行,注意 mimetype:
dojo.io.bind({
    url: 
" http://foo.bar.com/sampleData.js " ,
    load: 
function (type, evaldObj){  /*  do something  */  },
    mimetype: 
" text/javascript "
});

如果你想确保程序使用XMLHTTP,可以这样写:
dojo.io.bind({
    url: 
" http://foo.bar.com/sampleData.js " ,
    load: 
function (type, evaldObj){  /*  do something  */  },
    mimetype: 
" text/plain " //  get plain text, don't eval()
    transport:  " XMLHTTPTransport "
});
Being a jack-of-all-trades, bind() also supports the submission of forms via a request (with the single caveat that it won't do file upload over XMLHTTP):
作为一个jack-of-all-trades(万事通),bind()同样支持来自于表单提交的数据。
dojo.io.bind({
    url: 
" http://foo.bar.com/processForm.cgi " ,
    load: 
function (type, evaldObj){  /*  do something  */  },
    formNode: document.getElementById(
" formToSubmit " )
});
以上只是一些最基本的,其实这些可以不用全部由开发者自定义。

RPC
你可以看到,Dojo通过dojo.io.bind提供了简单,强大的方法使用多种多样的I/O functions。但是在开发过程中,程序员会调用很多很多I/O,这同时会给服务器和客户端加重负担。Dojo的RPC服务就是为了减少负担,易用,精简代码而生的。

RPC 的全名是Remote Procedre Calls,或者Remote Method Invocation,(译者:远程method调用)。最基本的,RPC允许开发者调用在远程服务器上的方法(method)。Dojo不仅提供了基本 的RPC client包,而且还扩展了它,使它支持JSON-RPC服务和YAHOO服务。同时你也可以自己写出相对于其他服务的类。

我们假定有一个需要调用服务器端程序的小程序,假设要调用add(x,y)和subtract(x,y)。在没有特殊情况的条件下,我们的客户端会这样写:
add  =   function (x,y) {

    request 
=  {x: x, y: y};

    dojo.io.bind({
            url: 
" add.php " ,
            load: onAddResults,
            mimetype: 
" text/plain " ,
        content: request
    });
}

subtract 
=   function (x,y) {

    request 
=  {x: x, y: y};
    
    dojo.io.bind({
            url: 
" subract " ,
            load: onSubtractResults,
            mimetype: 
" text/plain "
        content: request
    });
}


你 看,这不是很难。但是无论是我们让服务器运行add和subtract还是让客户端自己计算,这只是一个非常简单的程序。如果我们要调用在服务器上30个 不同method会怎么样呢?我猜我们可能要重复的写几乎一样的代码一遍又一遍,每次都要创建一个请求类(request object),设定URL,设定变量等等。这不仅容易出错,而且还很枯燥。
Dojo的RPC客户端简化了这个过程:
{
    
" serviceType " " JSON-RPC "
    
" serviceURL " " rpcProcessor.php "
    
" methods " :[ 
        {
            
" name " " add "
            
" parameters " :[
                {
" name " " x " },
                {
" name " " y " }    
            ]
        },
        {
            
" name " " subtract "
            
" parameters " :[
                {
" name " " x " },
                {
" name " " y " }    
            ]
        }

    ]
}

以上就是对于服务器的定义。一旦定义创建完毕,其他的事情就简单了,我们还可以创建一个类:
var  myObject  =   new  dojo.rpc.JsonService ? (defintion);
要使用服务器的方法:
myObject.add( 3 , 5 );

我 敢打赌你会在想“我不是只调用方法就够了,我还有得到计算的结果。”你是对的,但这也是非常容易的。服务器端的myObject.add()会返回一个延 缓类(deferred object)。Twisted Python用户可能对延缓类(deferred object)很熟悉,延缓类(deferred object)允许开发者根据返回数据的类型附加一个或更多的回叫(callbacks)和错误处理(errbacks)。这里有一个简单的例子:
var  myDeferred  =  myObject.add( 3 , 5 );
myDeferred.addCallback(myCallbackMethod);

我 们把mycallbackmethod作为回叫添加到我们的延缓类mydeferred。这时,8会被传递进mycallbackmethod。另一方 面,我们也可以添加一个errback method来处理服务器返回的出错信息。我们随意添加回叫方法(callback),多少都可以,它们会按照我们定义的顺序被调用。

以 上的例子都是围绕dojo.rpc.JsonService展开的。我们还可以使用dojo.rpc.YahooService,规范和结构都是一样的。 这两个类都是继承了dojo.rpc.RpcService。要创建自己的类会在第二章中详细介绍。(译者:第二章原著还没有完成)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值