曾 " /> 77788色淫网站免费视频,欧美成人精品三级网站,最近中文国语字幕在线播放视频

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

JavaScript系列之同步還是異步?

從今天開(kāi)始,我會(huì)不定期的寫(xiě)一些關(guān)于JavaScript的東西,包括語(yǔ)言,應(yīng)用等方面。組成JavaScript系列。
如果沒(méi)有特殊的說(shuō)明,這里假定JavaScript的執(zhí)行環(huán)境是在瀏覽器(browser)當(dāng)中的。
今天開(kāi)始第一次,討論一下同步和異步。

曾經(jīng)查詢過(guò)一些JavaScript的信息,發(fā)現(xiàn)google出來(lái)的結(jié)果都是詢問(wèn)JavaScript如何能夠?qū)崿F(xiàn)異步的代碼。
而我,很不幸,查詢的卻是如何讓JavaScript實(shí)現(xiàn)異步調(diào)用的同步(是不是挺起來(lái)很詭異)。

首先說(shuō)一下JavaScript當(dāng)中的異步方法。
其實(shí)這個(gè)問(wèn)題是大家經(jīng)常要碰到的。而且這個(gè)實(shí)現(xiàn)也很簡(jiǎn)單。我就不多說(shuō)了。
給兩段代碼

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

現(xiàn)在該說(shuō)一下我遇到的問(wèn)題了。
我現(xiàn)在使用dwr作為AJAX的server端引擎,在調(diào)用dwr方法的時(shí)候,需要提供一個(gè)回調(diào)方法(callback function)來(lái)接受server的返回結(jié)果。
而這個(gè)回調(diào)方法是不會(huì)被阻塞的。此時(shí)browser回啟動(dòng)另外的現(xiàn)成處理。
這個(gè)很好理解,因?yàn)閐wr的這個(gè)方法執(zhí)行的時(shí)間是無(wú)法預(yù)料的,如果此時(shí)調(diào)用被阻塞,而server又花相當(dāng)長(zhǎng)的時(shí)間進(jìn)行處理。那么瀏覽器就會(huì)死在這里。從用戶體驗(yàn)的角度是根本無(wú)法接受的。
這里的例子代碼是


ServerHandler.getString(”Weiming”, function (str) { //”Weiming”是傳回server的參數(shù)
alert(str);
}); // ServerHandler是dwr提供的server方法的interface,具體使用請(qǐng)參見(jiàn)dwr網(wǎng)站。
alert(1);
在執(zhí)行的過(guò)程中,會(huì)先執(zhí)行alert(1),然后在一個(gè)無(wú)法預(yù)料的時(shí)間后執(zhí)行alert(str)。
如果一次簡(jiǎn)單的比如hello world的調(diào)用是不會(huì)出問(wèn)題的。
但是如果我要執(zhí)行的一系列的dwr function是有前后順序的,比如后面執(zhí)行的需要前面的返回結(jié)果,簡(jiǎn)單的代碼書(shū)寫(xiě)順序是無(wú)法保證執(zhí)行順序的。
var myID = null;
ServerHandler.getID(function (id) {
myID = id; //無(wú)法預(yù)料何時(shí)會(huì)執(zhí)行這句話
});

ServerHandler.getUserWithID(myID, function (name) {
/*
此時(shí)myID還沒(méi)有值,因?yàn)樯厦娴?nbsp;myID = id這段代碼是需要一個(gè)時(shí)間段之后才會(huì)執(zhí)行的
*/
alert(”hello:” + name);
});

比如這樣的代碼就會(huì)出錯(cuò)。那么如何解決呢?
最簡(jiǎn)單的實(shí)現(xiàn)方法就是callback function的嵌套。

ServerHandler.getID(function (id) {
ServerHandler.getUserWithID(id, function (name) {
alert(”hello:” + name);
}
});
這樣我們就可以保證多個(gè)dwr方法調(diào)用的順序了。這樣貌似解決了問(wèn)題。但是并不完美。
原因是當(dāng)我們把JavaScript和Browser作為一個(gè)操作的平臺(tái)和邏輯業(yè)務(wù)的平臺(tái)(AJAX的應(yīng)用程序,后面的JavaScript系列中會(huì)有提及),而不是一個(gè)簡(jiǎn)單的展示平臺(tái)的時(shí)候。這樣的回調(diào)函數(shù)嵌套就很難控制了。
這也就是我最開(kāi)始指出的需要同步異步調(diào)用的一個(gè)方法。

最終我在公司的解決方案是這樣的。
寫(xiě)一個(gè)信號(hào)量的類(JavaScript的面向?qū)ο髸?huì)稍后講解),當(dāng)我需要執(zhí)行一個(gè)方法的時(shí)候,我就申請(qǐng)一部分信號(hào)量。
把需要被執(zhí)行的方法放進(jìn)信號(hào)量的隊(duì)列進(jìn)行等待。等前面等待的方法(如果存在)執(zhí)行后在執(zhí)行。
信號(hào)量將作為一個(gè)參數(shù)被傳入執(zhí)行的方法,這樣這個(gè)方法可以決定釋放這個(gè)信號(hào)量還是繼續(xù)分發(fā)。
比如
var s = new Semaphore();
var myID = null;
s.p(function (e) { //把方法放入信號(hào)量隊(duì)列
ServerHandler.getID(function (id) {
myID = id;
s.v(); //釋放信號(hào)量
}
});

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

這里只是對(duì)信號(hào)量這個(gè)方法進(jìn)行了簡(jiǎn)單的闡述。
信號(hào)量還支持創(chuàng)建自信號(hào)量,如果創(chuàng)建了子信號(hào)量,那么父信號(hào)量必須等帶所有的孩子都?xì)w還了信號(hào)量之后才可以執(zhí)行他里面的代碼。
由于代碼的版權(quán)是公司的,所以很抱歉,現(xiàn)在無(wú)法給出相應(yīng)的完整的信號(hào)量的實(shí)現(xiàn)。
如果下一端我有時(shí)間的話,我會(huì)給出一個(gè)我實(shí)現(xiàn)的版本的。

AspNet技術(shù)JavaScript系列之同步還是異步?,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 色视频免费网站 | 国内精品免费视频 | 日本人真淫视频一区二区三区 | 久久国产精品国语对白 | 六月婷婷七月丁香 | 国产精品美女一级在线观看 | 在线观看资源 | 欧美xxxx做受欧美人妖 | 欧美成人性色大片在线观看 | 黄网在线观看网址入口 | 在线视频免费国产成人 | 色老板免费在线观看 | 七七国产福利在线二区 | 亚洲一区二区三区中文字幕5566 | 激情6月丁香婷婷色综合 | 中文有码中文字幕免费视频 | 中文字幕一区在线观看视频 | 久草国产精品 | 99热国产在线观看 | 97人人模人人揉人人捏 | 自拍偷拍2019 | 91福利精品老师国产自产在线 | 亚洲区小说区图片区qvod | 高清视频一区二区 | 国产欧美一区二区精品性色99 | 四川幻女一级毛片 | 五月婷婷七月丁香 | 在线视频第二页 | 欧美性第一页 | 日韩理论在线播放 | 亚洲区在线播放 | 五月sese| 免费一区二区视频 | 怡红院成人g影院 | 国产精品综合一区二区 | 麻豆视频观看 | 久久亚洲国产 | 97se视频| 日日草草 | 亚洲精品第一国产综合高清 | 欧美日韩一区二区三区视频 |