曾 " /> 公开超碰在线视频,精品久久久久中文字幕,女生扒开下面

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript系列之同步還是異步?

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

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

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

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

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


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

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

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

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

最終我在公司的解決方案是這樣的。
寫一個信號量的類(JavaScript的面向?qū)ο髸院笾v解),當我需要執(zhí)行一個方法的時候,我就申請一部分信號量。
把需要被執(zhí)行的方法放進信號量的隊列進行等待。等前面等待的方法(如果存在)執(zhí)行后在執(zhí)行。
信號量將作為一個參數(shù)被傳入執(zhí)行的方法,這樣這個方法可以決定釋放這個信號量還是繼續(xù)分發(fā)。
比如
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()執(zhí)行之后,這個方法才會執(zhí)行。
ServerHandler.getName(myID, function (name) { //此時,可以保證myID一定有值
alert(”Hello:” + name);
s.v();
})
})

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

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

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

主站蜘蛛池模板: 亚洲欧美综合乱码精品成人网 | 亚洲欧美高清在线 | 国产精品女上位在线观看 | 成人精品亚洲 | 一区二区三区内射美女毛片 | 久热久热精品在线观看 | 男人和女人一级黄色大片 | 高hh乱亲女真实 | 国产精品成人啪精品视频免费观看 | 亚洲国产在线观看免费视频 | 99热久久精品国产一区二区 | 国产在线观看香蕉视频 | 岳的奶大又白又胖 | 久久99re66热这里只有精品 | 国产36d在线观看 | 国产成人精品久久久久婷婷 | 国产成人一区二区三区在线观看 | 国产曰批试看免费视频播放免费 | 国产美女裸身网站免费观看视频 | 在线中文字幕 | 超碰97视频在线观看 | 国产自拍视频在线一区 | 无码国产色欲XXXX视频 | XXX欧美性兽交 | 国内精品久久久久久久999下 | 一级特黄aa大片欧美 | WW.国产人妻人伦精品 | 欧美人xxxxx 欧美群交XXXCOM | 熟女久久久久久久久久久 | 无码国产精品高潮久久9 | 男人都懂www深夜免费网站 | 国产精品99久久久久久人韩国 | 饥渴的40岁熟妇完整版在线 | 妈妈的职业3完整版在线播放 | 国产人妻人伦精品59HHH | 热久久伊大人香蕉网老师 | 中文日韩亚洲欧美字幕 | 麻豆国产MV视频 | 97综合久久 | 在线日本高清日本免费 | 97超碰在线视频人人av |