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

JavaScript 異步調(diào)用框架 (Part 3 - 代碼實(shí)現(xiàn))

類結(jié)構(gòu)
首先我們來搭一個(gè)架子,把需要用到的似有變量都列出來。我們需要一個(gè)數(shù)組,來保存回調(diào)函數(shù)列表;需要一個(gè)標(biāo)志位,來表示異步操作是否已完成;還可以學(xué)IAsyncResult,加一個(gè)state,允許異步操作的實(shí)現(xiàn)者對外暴露自定義的執(zhí)行狀態(tài);最后加一個(gè)變量保存異步操作結(jié)果。
復(fù)制代碼 代碼如下:
Async = {
Operation: {
var callbackQueue = [];
this.result = undefined;
this.state = "waiting";
this.completed = false;
}
}

addCallback方法
接下來,我們要實(shí)現(xiàn)addCallback方法,它的工作職責(zé)很簡單,就是把回調(diào)函數(shù)放到callbackQueue中。此外,如果此時(shí)completed為true,說明異步操作已經(jīng)yield過了,則立即調(diào)用此回調(diào)。
復(fù)制代碼 代碼如下:
this.yield = function(callback) {
callbackQueue.push(callback);
if (this.completed) {
this.yield(this.result);
}
return this;
}

我們假設(shè)yield方法會(huì)把callbackQueue中的回調(diào)函數(shù)逐個(gè)取出來然后調(diào)用,因此如果compeleted為true,則使用已有的result再調(diào)用一次yield就可以了,這樣yield自然會(huì)調(diào)用這次添加到callbackQueue的回調(diào)函數(shù)。
至于最后的return this;,只是為了方便jQuery風(fēng)格的鏈?zhǔn)綄懛ǎ梢酝ㄟ^點(diǎn)號(hào)分隔連續(xù)添加多個(gè)回調(diào)函數(shù):
復(fù)制代碼 代碼如下:
asyncOperation(argument)
.addCallback(firstCallback)
.addCallback(secondCallback);

yield方法
最后,我們要實(shí)現(xiàn)yield方法。它需要將callbackQueue中的回調(diào)函數(shù)逐個(gè)取出來,然后都調(diào)用一遍,并且保證這個(gè)操作是異步吧。
復(fù)制代碼 代碼如下:
this.yield = function(result) {
var self = this;
setTimeout(function() {
self.result = result;
self.state = "completed";
self.completed = true;
while (callbackQueue.length > 0) {
var callback = callbackQueue.shift();
callback(self.result);
}
}, 1);
return this;
}

通過使用setTimeout,我們確保了yield的實(shí)際操作是異步進(jìn)行的。然后我們把用戶傳入yield的結(jié)果及相關(guān)狀態(tài)更新到對象屬性之上,最后遍歷callbackQueue調(diào)用所有的回調(diào)函數(shù)。
小結(jié)
這樣我們就做好了一個(gè)簡單的JavaScript異步調(diào)用框架,完整的代碼可以看這里:異步調(diào)用框架Async.Operation。
這個(gè)框架能夠很好的解決調(diào)用棧中出現(xiàn)同步異步操作并存的情況,假設(shè)所有函數(shù)都返回Async.Operation,框架的使用者可以使用一種統(tǒng)一的模式來編寫代碼,處理函數(shù)返回,而無需關(guān)心這個(gè)函數(shù)實(shí)際上是同步返回了還是異步返回了。
對于串行調(diào)用多個(gè)異步函數(shù)的情況,我們現(xiàn)在可以用嵌套addCallback的方式來書寫,但隨著嵌套層數(shù)的增多,代碼會(huì)變得越來越不美觀:
復(fù)制代碼 代碼如下:
firstAsyncOperation().addCallback(function() {
secondAsyncOperation().addCallback(function() {
thirdAsyncOperation().addCallback(function() {
finalSyncOperation();
});
});
});

我們能否把嵌套形式改為jQuery風(fēng)格的鏈?zhǔn)綄懛兀窟@是我們接下來要思考的問題,如果你不希望錯(cuò)過相關(guān)討論的話

JavaScript技術(shù)JavaScript 異步調(diào)用框架 (Part 3 - 代碼實(shí)現(xiàn)),轉(zhuǎn)載需保留來源!

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

主站蜘蛛池模板: 精品久久久久中文字幕 | 一二三四在线视频社区8 | 果冻传媒在线观看完整版免费 | 成人小视频在线观看免费 | xxx日本免费 | 雪恋电影完整版免费观看 | 久久精品亚洲精品国产欧美 | 国内精品免费视频精选在线观看 | 亚洲日本欧美日韩高观看 | 久久激情网| 人妻精品久久无码专区 | 亚洲综合春色另类久久 | 午夜理论片YY4399影院 | 性美国人xxxxx18 | 乌克兰10一12x video | 成人区在线观看免费视频 | 中文字幕亚洲欧美日韩2019 | 曰批视频免费40分钟不要钱 | 涩涩爱涩涩电影网站 | 伊人狠狠丁香婷婷综合尤物 | a级老头和老太xxxx | 久久无码AV亚洲精品色午夜 | 亚洲第一伊人 | 在线观看免费毛片 | 国内精品一级毛片免费看 | 国产精品一区二区亚瑟不卡 | 丝瓜影院观看免费高清国际观察 | 蜜柚视频在线观看全集免费观看 | 午夜熟女插插XX免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久国产香蕉视频 | 一区三区三区不卡 | 扒开女人下面使劲桶动态图 | 大胆国模一区二区三区伊人 | 国精产品一区二区三区有限公司 | 亚洲AV福利天堂一区二区三 | 国产精品久久久久久日本 | 一二三四在线播放免费观看中文版视频 | 国产精品高清视频在线 | 99精品欧美一区二区三区美图 | 在线观看亚洲专区5555 |