Burn Net--燒網(wǎng)

          玩的是電腦,別被電腦玩了。

          統(tǒng)計(jì)

          留言簿(2)

          積分與排名

          Dojo

          閱讀排行榜

          評(píng)論排行榜

          Dojo book第一章補(bǔ)充 I/O

          譯者序:
          Dojo book目前還在不斷更新和補(bǔ)充中,我會(huì)盡量跟上原著的腳步,給大家最新的信息。
          更新我會(huì)用隨筆寫出來,同時(shí)也會(huì)更新原文章。

          I/O

          dojo.io.blind介紹


          在我們制作dojo的時(shí)候,目的是讓用戶和開發(fā)者都能享受到DHTML程序。在很多朋友的支持下,特別是Aaron Boodman和Mark Anderson,我們已經(jīng)找到了解決可用性的方法。我們提供了一個(gè)單獨(dú)的易用的API和一個(gè)包裝類,這個(gè)類只需要兩個(gè)文件。dojo.io包提供了對(duì)XMLHTTP和一些其他更復(fù)雜的傳輸結(jié)構(gòu)的支持。

          在dojo.io包中我們一般最常使用的是dojo.io.bind()方法。dojo.io.blind()是一個(gè)標(biāo)準(zhǔn)的異步的請(qǐng)求API,它包含了各種傳輸層(transport layers),包括queues of iFrames,XMLHTTP,mod_pubsub,LivePage等等。Dojo會(huì)試圖為當(dāng)前的請(qǐng)求選擇最合適的傳輸方法,因?yàn)樵谧鼍W(wǎng)站時(shí)一般不會(huì)使用到其他傳輸,所以我們只用到XMLHTTP。dojo接受一個(gè)匿名的類,但是在知道這個(gè)類的屬性的情況下,把它作為方法參數(shù)(function argument)。下面的代碼是創(chuàng)建一個(gè)請(qǐng)求(request),這個(gè)請(qǐng)求會(huì)從URL返回原始的字符串。
          dojo.io.bind({
          ????url:?
          "http://foo.bar.com/sampleData.txt",
          ????load:?
          function(type,?data,?evt){?/*do?something?w/?the?data?*/?},
          ????mimetype:?
          "text/plain"
          });

          這就是全部,你提供了一個(gè)數(shù)據(jù)地址,還有一個(gè)當(dāng)你得到返回值時(shí)要執(zhí)行的function。但是如果在請(qǐng)求過程中出錯(cuò)了怎么辦呢?我們?cè)賮韯?chuàng)建一個(gè)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"
          });

          同樣也可以只創(chuàng)建一個(gè)單獨(dú)的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程序段,然后讓服務(wù)器運(yùn)行它,一般我們這么做是為了加速程序運(yùn)行,注意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):
          作為一個(gè)jack-of-all-trades(萬事通),bind()同樣支持來自于表單提交的數(shù)據(jù)。
          dojo.io.bind({
          ????url:?
          "http://foo.bar.com/processForm.cgi",
          ????load:?
          function(type,?evaldObj){?/*?do?something?*/?},
          ????formNode:?document.getElementById(
          "formToSubmit")
          });
          以上只是一些最基本的,其實(shí)這些可以不用全部由開發(fā)者自定義。

          RPC
          你可以看到,Dojo通過dojo.io.bind提供了簡單,強(qiáng)大的方法使用多種多樣的I/O functions。但是在開發(fā)過程中,程序員會(huì)調(diào)用很多很多I/O,這同時(shí)會(huì)給服務(wù)器和客戶端加重負(fù)擔(dān)。Dojo的RPC服務(wù)就是為了減少負(fù)擔(dān),易用,精簡代碼而生的。

          RPC的全名是Remote Procedre Calls,或者Remote Method Invocation,(譯者:遠(yuǎn)程method調(diào)用)。最基本的,RPC允許開發(fā)者調(diào)用在遠(yuǎn)程服務(wù)器上的方法(method)。Dojo不僅提供了基本的RPC client包,而且還擴(kuò)展了它,使它支持JSON-RPC服務(wù)和YAHOO服務(wù)。同時(shí)你也可以自己寫出相對(duì)于其他服務(wù)的類。

          我們假定有一個(gè)需要調(diào)用服務(wù)器端程序的小程序,假設(shè)要調(diào)用add(x,y)和subtract(x,y)。在沒有特殊情況的條件下,我們的客戶端會(huì)這樣寫:
          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
          ????});
          }


          你看,這不是很難。但是無論是我們讓服務(wù)器運(yùn)行add和subtract還是讓客戶端自己計(jì)算,這只是一個(gè)非常簡單的程序。如果我們要調(diào)用在服務(wù)器上30個(gè)不同method會(huì)怎么樣呢?我猜我們可能要重復(fù)的寫幾乎一樣的代碼一遍又一遍,每次都要?jiǎng)?chuàng)建一個(gè)請(qǐng)求類(request object),設(shè)定URL,設(shè)定變量等等。這不僅容易出錯(cuò),而且還很枯燥。
          Dojo的RPC客戶端簡化了這個(gè)過程:

          {
          ????
          "serviceType":?"JSON-RPC",?
          ????
          "serviceURL":?"rpcProcessor.php",?
          ????
          "methods":[?
          ????????{
          ????????????
          "name":?"add",?
          ????????????
          "parameters":[
          ????????????????{
          "name":?"x"},
          ????????????????{
          "name":?"y"}????
          ????????????]
          ????????},
          ????????{
          ????????????
          "name":?"subtract",?
          ????????????
          "parameters":[
          ????????????????{
          "name":?"x"},
          ????????????????{
          "name":?"y"}????
          ????????????]
          ????????}

          ????]
          }

          以上就是對(duì)于服務(wù)器的定義。一旦定義創(chuàng)建完畢,其他的事情就簡單了,我們還可以創(chuàng)建一個(gè)類:
          var?myObject?=?new?dojo.rpc.JsonService?(defintion);
          要使用服務(wù)器的方法:
          myObject.add(3,5);

          我敢打賭你會(huì)在想“我不是只調(diào)用方法就夠了,我還有得到計(jì)算的結(jié)果。”你是對(duì)的,但這也是非常容易的。服務(wù)器端的myObject.add()會(huì)返回一個(gè)延緩類(deferred object)。Twisted Python用戶可能對(duì)延緩類(deferred object)很熟悉,延緩類(deferred object)允許開發(fā)者根據(jù)返回?cái)?shù)據(jù)的類型附加一個(gè)或更多的回叫(callbacks)和錯(cuò)誤處理(errbacks)。這里有一個(gè)簡單的例子:
          var?myDeferred?=?myObject.add(3,5);
          myDeferred.addCallback(myCallbackMethod);

          我們把mycallbackmethod作為回叫添加到我們的延緩類mydeferred。這時(shí),8會(huì)被傳遞進(jìn)mycallbackmethod。另一方面,我們也可以添加一個(gè)errback method來處理服務(wù)器返回的出錯(cuò)信息。我們隨意添加回叫方法(callback),多少都可以,它們會(huì)按照我們定義的順序被調(diào)用。

          以上的例子都是圍繞dojo.rpc.JsonService展開的。我們還可以使用dojo.rpc.YahooService,規(guī)范和結(jié)構(gòu)都是一樣的。這兩個(gè)類都是繼承了dojo.rpc.RpcService。要?jiǎng)?chuàng)建自己的類會(huì)在第二章中詳細(xì)介紹。(譯者:第二章原著還沒有完成)

          posted on 2006-06-27 16:56 Burn Net 閱讀(2476) 評(píng)論(7)  編輯  收藏 所屬分類: Dojo

          評(píng)論

          # re: Dojo book第一章補(bǔ)充 I/O 2006-06-27 21:21 winneryong

          沙發(fā)。。。辛苦了~  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2006-07-04 16:38 smilingOx

          謝1  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2006-07-26 17:28 NiShaoChun

          用過DWR感覺還是不錯(cuò)的,后來又看了bindows感覺更好(不過就是商用的),看了你寫的dojo,期待后面的。  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2006-09-27 12:43 oh_yes

          簡直是太不象話了, 翻譯的這么好,竟然不翻譯后面的了,我嚴(yán)正抗議,強(qiáng)烈要求趕快出后面的。  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2006-10-30 16:04 bb

          這方面資料太少,勞你go next  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2006-11-20 16:54 wwwtiger

          辛苦了,dojo確實(shí)不錯(cuò)  回復(fù)  更多評(píng)論   

          # re: Dojo book第一章補(bǔ)充 I/O 2007-05-12 15:40 大屏幕系統(tǒng)方案網(wǎng)

          大屏幕系統(tǒng)方案網(wǎng)(www.saus.cn)提供專業(yè)的音視頻信號(hào)傳輸處理設(shè)備,大屏幕拼接技術(shù)方案咨詢,下載,包括:DLP、CRT、LED、LCD液晶、PDP等離子大屏幕拼接方案;相關(guān)大屏幕背投設(shè)備有:DLP單元、CRT單元;大屏幕信號(hào)處理設(shè)備VGA矩陣、RGB矩陣、AV視頻矩陣、長線驅(qū)動(dòng)器和格式轉(zhuǎn)換器;大屏幕顯示設(shè)備包括:背投一體機(jī)、等離子拼接單元.廣泛應(yīng)用于:DLP、CRT、液晶LCD、等離子PDP等大屏幕顯示系統(tǒng)中.  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 张家港市| 罗山县| 清原| 积石山| 卓资县| 西吉县| 将乐县| 商城县| 大竹县| 娱乐| 合作市| 景泰县| 高雄县| 科技| 蕉岭县| 隆回县| 太谷县| 独山县| 宝山区| 固安县| 昭觉县| 徐州市| 陕西省| 华容县| 夏河县| 锡林浩特市| 治多县| 乳山市| 上蔡县| 海兴县| 浦城县| 水富县| 高要市| 江川县| 雅江县| 大理市| 休宁县| 如皋市| 花莲市| 称多县| 吉水县|