|
遠程過程調(diào)用(Remote Procedure Calls(RPC)),也稱作遠程方法調(diào)用( Remote Method Invocations)是客戶端/服務(wù)器模式應(yīng)用開發(fā)的主要技術(shù)之一。RPC允許開發(fā)者調(diào)用遠程主機的方法。Dojo提供了一個基本的RPC客戶端類, 并且已經(jīng)擴展,可以提供對JSON-RPC服務(wù)和Yahoo服務(wù)的訪問。 我們假設(shè)已經(jīng)擁有了一個小型的應(yīng)用,希望執(zhí)行服務(wù)器調(diào)用。出于簡單起見,我們希望服務(wù)器執(zhí)行的方法加法和減法操作,即add(x,y)和substract(x,y)。在RPC客戶端,我們編寫以下的代碼: add = function(x,y) {
由上代碼可見,實現(xiàn)并不是十分復(fù)雜。這僅僅是一個小型的應(yīng)用。如果我們的應(yīng)用 不是這么簡單,而是包含了30個不同的請求,將會發(fā)生什么狀況?我們不得不為不同的請求一次次編寫這些相同的代碼;每一次獲得一個請求對象,指定URL, 往往還要驗證參數(shù)類型等等。這種做法煩瑣無聊,而且常常導(dǎo)致錯誤。 Dojo的客戶端通過對應(yīng)用所需的遠程方法的簡單定義,生成客戶端函數(shù)調(diào)用這些方法,從而簡化了這整個過程。開發(fā)者只需要編寫定義文件,初始化RPC客戶端對象,所有這些遠程方法便可以供開發(fā)者正常使用。 需要編寫的定義,也稱為簡單方法描述(Simple Method Description(SMD))文件,是一個簡單的JSON字符串,定義了RPC請求將要處理的URL,這個URL可供調(diào)用的一些方法,以及這些方法 所需的參數(shù)。在我們這個范例中,這個定義文件的內(nèi)容如下: {
在完成描述的創(chuàng)建之后,代碼將變得相當(dāng)簡單。這個定義可以以一個字符串,一個可以獲取到這個定義的URL,或者是一個JavaScript對象的方式提供。 var myObject = new dojo.rpc.JsonService(definition); 以上就是客戶端創(chuàng)建遠程調(diào)用類的所有代碼,剩下的工作就是對方法的調(diào)用了。 myObject.add(3,5); 當(dāng)然,你可能會說:“相當(dāng)漂亮,但是我還需要獲取相加后的結(jié)果,而不僅僅是簡 單的調(diào)用”。獲得結(jié)果的實現(xiàn)同樣也很簡單。我們執(zhí)行了服務(wù)器的異步調(diào)用,myObject.add()調(diào)用的返回值是一個deferred對象(使用 Twisted Python或MochiKit的用戶對這個對象比較熟悉)。deferred對象允許開發(fā)者為結(jié)果事件附加一到多個的回調(diào)函數(shù)。我們的簡單范例如下: var myDeferred = myObject.add(3,5); 或者是更為簡單直接的方式: var myDeferred = myObject.add(3,5).addCallback(myCallbackMethod);
由上代碼可見,我們?yōu)閙yObject.add()返回的deferred對 象附加了myCallbackMethod作為一個回調(diào)函數(shù)。在這個范例中myCallbackMethod將通過使用參數(shù)8被調(diào)用。同時,我們也可以附 加錯誤處理的回調(diào)函數(shù)到deferred對象。我們可以附加任意個回調(diào)函數(shù),他們將被依次調(diào)用。 |
|
|