最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2009年08月04日 00:04:34   作者:  
在上一篇文章里,我們說到了要實(shí)現(xiàn)一個(gè)Async.Operation類,通過addCallback方法傳遞回調(diào)函數(shù),并且通過yield方法返回回調(diào)結(jié)果?,F(xiàn)在我們就來實(shí)現(xiàn)這個(gè)類吧。
類結(jié)構(gòu)
首先我們來搭一個(gè)架子,把需要用到的似有變量都列出來。我們需要一個(gè)數(shù)組,來保存回調(diào)函數(shù)列表;需要一個(gè)標(biāo)志位,來表示異步操作是否已完成;還可以學(xué)IAsyncResult,加一個(gè)state,允許異步操作的實(shí)現(xiàn)者對(duì)外暴露自定義的執(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)更新到對(duì)象屬性之上,最后遍歷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í)際上是同步返回了還是異步返回了。
對(duì)于串行調(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)討論的話

相關(guān)文章

  • web打印小結(jié)

    web打印小結(jié)

    本文主要介紹了一款比較強(qiáng)大的web打印工具lodop實(shí)現(xiàn)將winform客戶端的打印,移到網(wǎng)頁上由客戶自行打印,打印要求是根據(jù)一定的格式實(shí)現(xiàn)套打的過程與方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • javascript實(shí)現(xiàn)勻速動(dòng)畫效果

    javascript實(shí)現(xiàn)勻速動(dòng)畫效果

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)勻速動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 判定是否原生方法的JS代碼

    判定是否原生方法的JS代碼

    這篇文章介紹了判定是否原生方法的JS代碼,有需要的朋友可以參考一下
    2013-11-11
  • 通過JS和PHP兩種方法判斷用戶請(qǐng)求時(shí)使用的瀏覽器類型

    通過JS和PHP兩種方法判斷用戶請(qǐng)求時(shí)使用的瀏覽器類型

    在做微站點(diǎn)項(xiàng)目開發(fā)的時(shí)候,我們需要判斷當(dāng)前瀏覽器類型是什么。接下來小編給大家分享通過JS和PHP兩種方法判斷用戶請(qǐng)求時(shí)使用的瀏覽器類型,非常不錯(cuò),感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09
  • 前端實(shí)現(xiàn)CSV文件解析的方法詳解

    前端實(shí)現(xiàn)CSV文件解析的方法詳解

    這篇文章主要為大家詳細(xì)介紹了前端實(shí)現(xiàn)CSV文件解析的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解一下
    2024-03-03
  • 關(guān)于javascript中限定時(shí)間內(nèi)防止按鈕重復(fù)點(diǎn)擊的思路詳解

    關(guān)于javascript中限定時(shí)間內(nèi)防止按鈕重復(fù)點(diǎn)擊的思路詳解

    下面小編就為大家?guī)硪黄P(guān)于javascript中限定時(shí)間內(nèi)防止按鈕重復(fù)點(diǎn)擊的思路詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • 在 JavaScript 中保留小數(shù)點(diǎn)后兩位的方法

    在 JavaScript 中保留小數(shù)點(diǎn)后兩位的方法

    在 JavaScript 中,有多種方法可以保留小數(shù)點(diǎn)后兩位,本文給大家分享比較常用的方法,文末給大家介紹了實(shí)現(xiàn)數(shù)據(jù)格式化保留兩位小數(shù)的多種方法,感興趣的朋友一起看看吧
    2023-10-10
  • JavaScript實(shí)現(xiàn)列出數(shù)組中最長的連續(xù)數(shù)

    JavaScript實(shí)現(xiàn)列出數(shù)組中最長的連續(xù)數(shù)

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)列出數(shù)組中最長的連續(xù)數(shù)的方法及使用,需要的朋友可以參考下
    2014-12-12
  • ES6中的WeakMap和WeakSet特性和用途詳解

    ES6中的WeakMap和WeakSet特性和用途詳解

    在JavaScript的ES6版本中,引入了WeakMap和WeakSet這兩種新的數(shù)據(jù)結(jié)構(gòu),與Map和Set相比,它們有一些特殊的特點(diǎn)和用途,使它們?cè)谔幚韮?nèi)存泄漏問題、管理對(duì)象私有數(shù)據(jù)、處理對(duì)象的唯一性等場(chǎng)景中有顯著的優(yōu)勢(shì),本文將深入探討WeakMap和WeakSet的特性和用途,一起看看吧
    2023-12-12
  • 微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問題解決

    微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問題解決

    這篇文章主要介紹了微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

乐东| 华池县| 资源县| 广宗县| 中超| 扬中市| 恩施市| 广安市| 巴楚县| 同德县| 鸡泽县| 通辽市| 东乡族自治县| 玉环县| 桐城市| 体育| 芒康县| 即墨市| 尚义县| 大渡口区| 民权县| 弥勒县| 十堰市| 射洪县| 广平县| 新沂市| 鄂尔多斯市| 富源县| 比如县| 治多县| 雷波县| 宜宾市| 子洲县| 磴口县| 长顺县| 城口县| 五河县| 尚义县| 龙江县| 安平县| 沙坪坝区|