Dojo学习16 dojo.rpc.JsonService远程过程调用

16. dojo.rpc.JsonService远程过程调用
远程过程调用(Remote Procedure Calls(RPC)),也称作远程方法调用( Remote Method Invocations)是客户端/服务器模式应用开发的主要技术之一。RPC允许开发者调用远程主机的方法。Dojo提供了一个基本的RPC客户端类,并且已经扩展,可以提供对JSON-RPC服务和Yahoo服务的访问。
我们假设已经拥有了一个小型的应用,希望执行服务器调用。出于简单起见,我们希望服务器执行的方法加法和减法操作,即add(x,y)和substract(x,y)。在RPC客户端,我们编写以下的代码:
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: "subtract",
    load: onSubtractResults,
    mimetype: "text/plain",
    content: request
  });
}
由上代码可见,实现并不是十分复杂。这仅仅是一个小型的应用。如果我们的应用不是这么简单,而是包含了30个不同的请求,将会发生什么状况?我们不得不为不同的请求一次次编写这些相同的代码;每一次获得一个请求对象,指定URL,往往还要验证参数类型等等。这种做法烦琐无聊,而且常常导致错误。
Dojo的客户端通过对应用所需的远程方法的简单定义,生成客户端函数调用这些方法,从而简化了这整个过程。开发者只需要编写定义文件,初始化RPC客户端对象,所有这些远程方法便可以供开发者正常使用。
需要编写的定义,也称为简单方法描述(Simple Method Description(SMD))文件,是一个简单的JSON字符串,定义了RPC请求将要处理的URL,这个URL可供调用的一些方法,以及这些方法所需的参数。在我们这个范例中,这个定义文件的内容如下:

  "serviceType": "JSON-RPC",
  "serviceURL": "rpcProcessor.php",
  "methods":[
    {
      "name": "add",
      "parameters":[
        {"name": "x"},
        {"name": "y"}
      ]
    },
    {
      "name": "subtract",
      "parameters":[
        {"name": "x"},
        {"name": "y"}
      ]
    }
  ]
}
在完成描述的创建之后,代码将变得相当简单。这个定义可以以一个字符串,一个可以获取到这个定义的URL,或者是一个JavaScript对象的方式提供。
var myObject = new dojo.rpc.JsonService(definition);
以上就是客户端创建远程调用类的所有代码,剩下的工作就是对方法的调用了。
myObject.add(3,5);
当然,你可能会说:“相当漂亮,但是我还需要获取相加后的结果,而不仅仅是简单的调用”。获得结果的实现同样也很简单。我们执行了服务器的异步调用,myObject.add()调用的返回值是一个deferred对象(使用Twisted Python或MochiKit的用户对这个对象比较熟悉)。deferred对象允许开发者为结果事件附加一到多个的回调函数。我们的简单范例如下:
var myDeferred = myObject.add(3,5);
myDeferred.addCallback(myCallbackMethod);
或者是更为简单直接的方式:
var myDeferred = myObject.add(3,5).addCallback(myCallbackMethod);
由上代码可见,我们为myObject.add()返回的deferred对象附加了myCallbackMethod作为一个回调函数。在这个范例中myCallbackMethod将通过使用参数8被调用。同时,我们也可以附加错误处理的回调函数到deferred对象。我们可以附加任意个回调函数,他们将被依次调用。

你可能感兴趣的:(Dojo学习16 dojo.rpc.JsonService远程过程调用)