变态重口极致另类在线-波多久久夜色精品国产-波多野结衣在线观看一区-波多野结衣在线观看一区二区-污污的网站免费阅读-污污视频网址

當(dāng)前位置:首頁文章首頁 IT學(xué)院 IT技術(shù)

Javascript的回調(diào)機制的經(jīng)典教程

作者:  來源:  發(fā)布時間:2011-6-6 10:17:59  點擊:
  30. return 0;

  31.}

  32.//}}}

  例 5中有兩個版本,get_data_v5a假設(shè)了通信機制可以透傳a和b兩個參數(shù)給回調(diào)函數(shù),get_data_v5b則使用了兩個全局變量來傳遞處理結(jié) 果所需的參數(shù)。兩個都不見得是很好的方法,get_data_v5a的問題是,異步通信的機制不見得能提供這種透傳機制,除非程序員自己封裝;即使程序員 自己封裝,那也意味著如果要實現(xiàn)多個處理數(shù)據(jù)的過程(像get_data)那就要實現(xiàn)多個異步調(diào)用的過程(send_and_recv_async),代 碼復(fù)雜且復(fù)用性差不好維護。而全局變量的版本也好不到哪里去,使用這種全局的機制,意味著不必要的信息暴露,也就有被別的地方錯修改的問題,同時這個函數(shù) 還變成不可重入的。即使將全局機制封裝在一個類里面,每次初始化一個對象,可以改善依然不能解決信息暴露的問題,同時還帶來了管理這多個對象的復(fù)雜性。

  

  兩種方法相比而言,貌似透傳的機制要稍好一些。我們對get_data_v5a略做修改,使得它通信過程能夠有更廣泛的復(fù)用。

  

  例6 使用一個closure對象打包過程中的參數(shù)

  view plaincopy to clipboardprint?

  01.//{{{get_data_v6

  02.// 為了統(tǒng)一回調(diào)函數(shù)的形式并且縮短回調(diào)的參數(shù)列表,將這種需要透傳的參數(shù)只有一個

  03.// 統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)打包

  04.void get_data_v6(int a, int b)

  05.{

  06. // 準(zhǔn)備數(shù)據(jù)

  07. char bufCmd[]="cmd=1001&uin=123456?m=abc";

  08. char bufRcv[4096];

  09. // 打包處理結(jié)果所需要的參數(shù)

  10. closure.a = a;

  11. closure.b = b;

  12. // 通信

  13. send_and_recv_async(addr, bufCmd, bufRcv, callback, closure);

  14.} // end of get_data_v6

  15.// 回調(diào)函數(shù)的定義

  16.int callback(char* bufRcv, struct closure) {

  17. // 處理結(jié)果

  18. use(bufRcv, closure.a, closure.b);

  19. return 0;

  20.}

  21.//}}}

  例 6里面使用了一個叫closure的結(jié)構(gòu),假設(shè)這個結(jié)構(gòu)是個通用的數(shù)據(jù)容器,可以容納我們使用的個中類型的任意數(shù)量的參數(shù)。增加了這一個萬能的數(shù)據(jù)容器參 數(shù)以后,異步通信過程只要能透傳這么一個數(shù)據(jù)容器就能夠很好支持個中各樣的參數(shù)透傳的需求。這個數(shù)據(jù)容器由于是在get_data函數(shù)內(nèi)部產(chǎn)生的局部變 量,不會污染全局?jǐn)?shù)據(jù)或者比get_data更大的作用域。這種受限的可見性不僅提高了代碼的可維護性,還恢復(fù)了函數(shù)的可重入性。

  

  至此我 們關(guān)于回調(diào)機制的實現(xiàn)的假想代碼可以說已經(jīng)達到比較優(yōu)雅的程度了,僅僅還有一朵小烏云。那就是我們忽略了C/C++語言里面并沒有原生實現(xiàn)這個超級結(jié)構(gòu), 同樣我們依然還有一點點麻煩就是還需要指定要透傳的參數(shù)。考慮到原本從準(zhǔn)備數(shù)據(jù)到通信再到處理結(jié)果是一個完整統(tǒng)一的過程,原本不需要區(qū)分什么數(shù)據(jù)是前半端 使用的什么數(shù)據(jù)是后半段使用的,只要腳氣怎么治療讓前半端和后半段共享一個上下文在大部分情況下就能滿足需求了。所以現(xiàn)實情況下我們只能做一些妥協(xié),使用個中折衷方案 來使得程序能運行起來。同樣,考慮到回調(diào)函數(shù)和啟動函數(shù)的關(guān)系,給回調(diào)函數(shù)命名也不是那么優(yōu)雅的事情,因為畢竟它們只是同一個過程的兩半,卻要使用兩個名 字,合理一點就應(yīng)該叫g(shù)et_data_first和get_data_second,或者get_data_trigger和 get_data_result_handler。如果接口多的話,就會有很多這種某過程first和某過程second,或者某過程trigger和某 過程result_handler。能不能某過程就象同步那樣使用一個名字呢?我們的設(shè)想真的就沒有辦法達到嗎?答案是否定的,在Javascript能 夠幫助我們實現(xiàn)我們所有的設(shè)想。見例7。

  

  例7 Javascript的異步調(diào)用

  view plaincopy to clipboardprint?

  01.//{{{get_data_js

  02.//

  03.// 寫成Javascript代碼就變成現(xiàn)在這個樣子

  04.// url對應(yīng)之前的addr

  05.// 使用匿名函數(shù)代替原來命名的callback定義

  06.// 原生支持閉包closure

  07.//

  08.function get_data_js(a, b)

  09.{

  10. var bufCmd = "cmd=1001&uin=123456?m=abc";

  11. var bufRcv;

  12. send_and_recv_with_xhr(/*addr*/url, bufCmd, bufRcv, /*callback*/

  13. function(bufRcv/*, closure*/) {

  14. use(bufRcv, /*closure.*/a, /*closure.*/b);

  15. return 0;

  16. }

  17. );

  18.}

  19.//}}}

  例 7是使用Javascript實現(xiàn)類似例6的功能,僅僅存在一些細(xì)微的差別。例6的場景下可能更多使用TCP或者UDP作為通信協(xié)議,而在例7使用的則是 瀏覽器提供的XHR對象實現(xiàn)的HTTP協(xié)議。這點差別并不會影響我們對于異步通信下回調(diào)函數(shù)實現(xiàn)機制的討論,只要他們的通信機制都是異步的就可以了。例7 中使用注釋的形式標(biāo)注了例6里面使用的一些參數(shù)的名字以暗示它們的對應(yīng)關(guān)系,方便比較這兩個例子。我們看到了,在Javascript里面我們所有的設(shè)想 都變成了現(xiàn)實。(1)首先關(guān)于能夠透傳一切的超級結(jié)構(gòu),Javascript中實現(xiàn)了閉包的機制,保證了在這種內(nèi)部的函數(shù)對象可以訪問到定義它的環(huán)境能訪 問到的所有數(shù)據(jù),也就是在例7中的匿名回調(diào)函數(shù)可以訪問到get_data_js中能訪問到的所有數(shù)據(jù)。當(dāng)然,這里重要的是局部數(shù)據(jù),如a和b。如果是全 局?jǐn)?shù)據(jù)的話左旋肉堿真的有用嗎并不需要通過閉包也能訪問到。而且這個過程是Javascript的運行環(huán)境提供的,對于程序員是透明的,程序員并不需要指定哪些參數(shù)需要透 傳。(2)不需要再為回調(diào)函數(shù)命名,因為Javascript支持匿名函數(shù)的定義,可以像定義變量一樣定義函數(shù)。而這個最終導(dǎo)致了我們在使用異步通信機制 的時候和使用同步的通信機制及其接近,沒有多余的名字,沒有不必要的可見性。

文章評論

軟件按字母排列: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
主站蜘蛛池模板: 国产精亚洲视频 | 天堂中文资源在线8 | 中文字幕亚洲精品日韩精品 | 性感美女视频免费网站午夜 | 国产高清在线精品二区一 | 天天拍夜夜添久久精品免费 | a级毛片蜜桃成熟时2在线播放 | 天天摸日日摸人人看 | 欧美另类第一页 | ww7788色淫网站女女免费 | 日本成人免费 | 国产亚洲一区二区麻豆 | 亚洲 欧美 91 | 天天做天天爱天天爽 | 欧美在线一区二区三区 | 欧美一级做一级做片性十三 | 激情综合五月网 | 黄色的视频免费看 | 在线视频亚洲欧美 | 国产日韩欧美二区 | 国产婷婷色一区二区三区深爱网 | 国产在线精品成人一区二区三区 | 欧美韩日 | 日日噜噜噜噜人人爽亚洲精品 | 日韩在线毛片 | 亚洲视屏在线观看 | 欧美日本一 | 日韩手机在线视频 | 一级免费视频 | 午夜影院普通 | 日韩特级毛片免费观看视频 | 在线免费观看黄视频 | 亚洲人成网站在线观看播放 | 久久久99精品免费观看精品 | 国产亚洲3p一区二区三区 | 天天摸天天操天天爽 | 欧美一级黄色片视频 | 69国产成人精品视频软件 | 成人美女黄网站色大色费 | 精品欧美在线精品 | 制服丝袜在线视频 |