亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

JavaScript系列之―同步還是異步?

2024-07-10 13:14:17
字體:
來源:轉載
供稿:網友
從今天開始,我會不定期的寫一些關于JavaScript的東西,包括語言,應用等方面。組成JavaScript系列。 
如果沒有特殊的說明,這里假定JavaScript的執行環境是在瀏覽器(browser)當中的。 
今天開始第一次,討論一下同步和異步。 

曾經查詢過一些JavaScript的信息,發現google出來的結果都是詢問JavaScript如何能夠實現異步的代碼。 
而我,很不幸,查詢的卻是如何讓JavaScript實現異步調用的同步(是不是挺起來很詭異)。 

首先說一下JavaScript當中的異步方法。 
其實這個問題是大家經常要碰到的。而且這個實現也很簡單。我就不多說了。 
給兩段代碼 

setTimeout方法,他讓你的代碼在指定的時間(毫秒)之后執行指定的方法。只執行一次。 
比如: 
alert(1); 
setTimeout(”alert(2)”, 1000); 
alert(3); 
代碼在執行到setTimeout的時候,會繼續執行下面的代碼(alert(3))而不會被阻塞。等待1000ms之后執行alert(2) 
setInterval方法,他讓你的代碼每隔指定的時間,執行指定的方法,直到調用clearInterval 
比如: 
alert(1); 
timer = setInterval(”alert(2)”, 1000); 
alert(3); 
代碼基本上和上面的相同,不同的是,每隔1000ms就會執行一次alert(2),直到調用 
clearInterval(timer); 
我們應該注意到setTimeout和setInterval都是window的方法。 
我們可以直接使用,但是規范的還是調用window.setTimeout window.setInterval,之所以提及這個,我會在以后的JavaScript系列中繼續講解。 

現在該說一下我遇到的問題了。 
我現在使用dwr作為AJAX的server端引擎,在調用dwr方法的時候,需要提供一個回調方法(callback function)來接受server的返回結果。 
而這個回調方法是不會被阻塞的。此時browser回啟動另外的現成處理。 
這個很好理解,因為dwr的這個方法執行的時間是無法預料的,如果此時調用被阻塞,而server又花相當長的時間進行處理。那么瀏覽器就會死在這里。從用戶體驗的角度是根本無法接受的。 
這里的例子代碼是 

… 
ServerHandler.getString(”Weiming”, function (str) { //”Weiming”是傳回server的參數 
alert(str); 
}); // ServerHandler是dwr提供的server方法的interface,具體使用請參見dwr網站。 
alert(1); 
在執行的過程中,會先執行alert(1),然后在一個無法預料的時間后執行alert(str)。 
如果一次簡單的比如hello world的調用是不會出問題的。 
但是如果我要執行的一系列的dwr function是有前后順序的,比如后面執行的需要前面的返回結果,簡單的代碼書寫順序是無法保證執行順序的。 
var myID = null; 
ServerHandler.getID(function (id) { 
myID = id; //無法預料何時會執行這句話 
}); 

ServerHandler.getUserWithID(myID, function (name) { 
/* 
此時myID還沒有值,因為上面的 myID = id這段代碼是需要一個時間段之后才會執行的 
*/ 
alert(”hello:” + name); 
}); 

比如這樣的代碼就會出錯。那么如何解決呢? 
最簡單的實現方法就是callback function的嵌套。 
… 
ServerHandler.getID(function (id) { 
ServerHandler.getUserWithID(id, function (name) { 
alert(”hello:” + name); 

}); 
這樣我們就可以保證多個dwr方法調用的順序了。這樣貌似解決了問題。但是并不完美。 
原因是當我們把JavaScript和Browser作為一個操作的平臺和邏輯業務的平臺(AJAX的應用程序,后面的JavaScript系列中會有提及),而不是一個簡單的展示平臺的時候。這樣的回調函數嵌套就很難控制了。 
這也就是我最開始指出的需要同步異步調用的一個方法。 

最終我在公司的解決方案是這樣的。 
寫一個信號量的類(JavaScript的面向對象會稍后講解),當我需要執行一個方法的時候,我就申請一部分信號量。 
把需要被執行的方法放進信號量的隊列進行等待。等前面等待的方法(如果存在)執行后在執行。 
信號量將作為一個參數被傳入執行的方法,這樣這個方法可以決定釋放這個信號量還是繼續分發。 
比如 
var s = new Semaphore(); 
var myID = null; 
s.p(function (e) { //把方法放入信號量隊列 
ServerHandler.getID(function (id) { 
myID = id; 
s.v(); //釋放信號量 

}); 

s.p(function (e) { //將第二個方法放到信號量隊列,只有當前面的s.v()執行之后,這個方法才會執行。 
ServerHandler.getName(myID, function (name) { //此時,可以保證myID一定有值 
alert(”Hello:” + name); 
s.v(); 
}) 
}) 

這里只是對信號量這個方法進行了簡單的闡述。 
信號量還支持創建自信號量,如果創建了子信號量,那么父信號量必須等帶所有的孩子都歸還了信號量之后才可以執行他里面的代碼。 
由于代碼的版權是公司的,所以很抱歉,現在無法給出相應的完整的信號量的實現。 
如果下一端我有時間的話,我會給出一個我實現的版本的。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久亚洲国产| 97色在线播放视频| 日韩av影视综合网| 中文字幕不卡av| 亚洲成年人在线| 欧美专区在线观看| 欧美午夜精品久久久久久人妖| 美女性感视频久久久| 久久不射电影网| 亚洲另类图片色| 欧美风情在线观看| 欧美电影免费观看电视剧大全| 久久伊人精品一区二区三区| 亚洲国产精品成人一区二区| 91av网站在线播放| 97国产一区二区精品久久呦| 青青草原一区二区| 亚洲激情中文字幕| 精品久久久久久久久久久久| 国产一区二区三区在线视频| 国产精彩精品视频| 国产精品成人久久久久| 久久精品中文字幕免费mv| 亚洲成人久久久| 国产精品自拍偷拍| 九九热在线精品视频| 国产欧美日韩91| 久青草国产97香蕉在线视频| 人人爽久久涩噜噜噜网站| 国产精品第三页| 欧美xxxwww| 国产视频精品在线| 精品国产一区二区三区久久久狼| 欧美高清自拍一区| 日韩一区二区精品视频| 91av成人在线| 久久久免费观看| 国产日本欧美一区| 久久伊人精品天天| 成人网在线视频| 97免费中文视频在线观看| 欧美夜福利tv在线| 91精品免费看| 亚洲国产欧美一区二区丝袜黑人| 亚洲丝袜一区在线| 国产精品成人久久久久| 国产精品亚洲网站| 成人国产精品久久久久久亚洲| 欧美人与性动交| 亚洲毛片在线免费观看| 一本大道久久加勒比香蕉| 黑人狂躁日本妞一区二区三区| 色爱精品视频一区| 亚洲欧美制服综合另类| 伊人一区二区三区久久精品| 欧美激情18p| 欧美日韩一二三四五区| 一区二区av在线| 精品女厕一区二区三区| 国产亚洲欧美aaaa| 国产精品丝袜视频| 国产精品美女免费视频| 亚洲精品98久久久久久中文字幕| 亚洲男人7777| 91在线观看欧美日韩| 91精品久久久久久| 成人黄色片网站| 欧美精品videos另类日本| 一区二区三区精品99久久| 欧美激情在线视频二区| 粉嫩老牛aⅴ一区二区三区| www.日韩欧美| www.欧美三级电影.com| 欧亚精品在线观看| 日韩欧美国产高清91| 奇米成人av国产一区二区三区| 成人写真福利网| 亚洲精品免费在线视频| 精品久久久久人成| 国产精品1区2区在线观看| 色先锋久久影院av| 这里只有精品在线观看| 成人黄色大片在线免费观看| 国产精品扒开腿爽爽爽视频| 深夜成人在线观看| 亚洲男人天堂手机在线| 日韩在线视频导航| 国产欧美在线播放| 欧美华人在线视频| 国内精品伊人久久| 国产精品69精品一区二区三区| 日韩免费不卡av| 91免费在线视频网站| 按摩亚洲人久久| 精品久久久国产精品999| 欧美精品videos另类日本| 国产成人激情视频| 亚洲高清免费观看高清完整版| 国产成人午夜视频网址| 欧美体内谢she精2性欧美| 欧美激情视频网站| 中文字幕精品在线视频| 欧美特级www| 国产精品福利网站| 亚洲激情第一页| 日韩福利视频在线观看| 2019中文字幕在线免费观看| 欧美精品在线观看91| 自拍偷拍亚洲欧美| 精品久久久久久久久久久久| 日韩电影中文字幕在线观看| 777午夜精品福利在线观看| 菠萝蜜影院一区二区免费| 九九热99久久久国产盗摄| 久久久精品免费| 在线播放精品一区二区三区| 久久综合久中文字幕青草| 国产精品久久久久久av福利软件| 欧美一级成年大片在线观看| 欧美一区二区影院| 色偷偷偷综合中文字幕;dd| 欧美午夜美女看片| 欧美一级片免费在线| 精品五月天久久| 国产精品日韩专区| 亚洲性生活视频| 国产一区二区黑人欧美xxxx| 高潮白浆女日韩av免费看| 中文字幕在线看视频国产欧美在线看完整| 91精品视频在线| 国产激情视频一区| 91社区国产高清| 青草热久免费精品视频| 国产精品精品国产| 狠狠色狠色综合曰曰| 性色av一区二区三区在线观看| 国产精品久久久久久久7电影| 一本一本久久a久久精品综合小说| 97久久精品视频| 国产中文字幕日韩| 亚洲加勒比久久88色综合| 国产精品爽爽爽爽爽爽在线观看| 欧美极品在线视频| 欧美激情videos| 亚洲国产精品网站| 亚洲欧美中文另类| 日韩在线中文字| 国产在线视频一区| 岛国av一区二区在线在线观看| 国产精品入口日韩视频大尺度| 亚洲精品少妇网址| 成人激情视频在线观看| 日本一区二区在线播放| 亚洲国产古装精品网站| 亚洲第一免费网站| 欧美日韩视频在线| 欧美成人在线免费视频| 亚洲xxxx3d| 日韩视频第一页| 日韩网站免费观看| 日韩欧美一区视频| 中文字幕亚洲综合久久| 国产精品女人久久久久久| 午夜精品福利在线观看|