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

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

 更新時間:2009年08月04日 00:04:34   作者:  
在上一篇文章里,我們說到了要實現(xiàn)一個Async.Operation類,通過addCallback方法傳遞回調(diào)函數(shù),并且通過yield方法返回回調(diào)結(jié)果?,F(xiàn)在我們就來實現(xiàn)這個類吧。
類結(jié)構(gòu)
首先我們來搭一個架子,把需要用到的似有變量都列出來。我們需要一個數(shù)組,來保存回調(diào)函數(shù)列表;需要一個標(biāo)志位,來表示異步操作是否已完成;還可以學(xué)IAsyncResult,加一個state,允許異步操作的實現(xiàn)者對外暴露自定義的執(zhí)行狀態(tài);最后加一個變量保存異步操作結(jié)果。
復(fù)制代碼 代碼如下:

Async = {
Operation: {
var callbackQueue = [];
this.result = undefined;
this.state = "waiting";
this.completed = false;
}
}

addCallback方法
接下來,我們要實現(xiàn)addCallback方法,它的工作職責(zé)很簡單,就是把回調(diào)函數(shù)放到callbackQueue中。此外,如果此時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方法會把callbackQueue中的回調(diào)函數(shù)逐個取出來然后調(diào)用,因此如果compeleted為true,則使用已有的result再調(diào)用一次yield就可以了,這樣yield自然會調(diào)用這次添加到callbackQueue的回調(diào)函數(shù)。
至于最后的return this;,只是為了方便jQuery風(fēng)格的鏈?zhǔn)綄懛?,可以通過點號分隔連續(xù)添加多個回調(diào)函數(shù):
復(fù)制代碼 代碼如下:

asyncOperation(argument)
.addCallback(firstCallback)
.addCallback(secondCallback);

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

firstAsyncOperation().addCallback(function() {
secondAsyncOperation().addCallback(function() {
thirdAsyncOperation().addCallback(function() {
finalSyncOperation();
});
});
});

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

相關(guān)文章

  • web打印小結(jié)

    web打印小結(jié)

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

    javascript實現(xiàn)勻速動畫效果

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

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

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

    通過JS和PHP兩種方法判斷用戶請求時使用的瀏覽器類型

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

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

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

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

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

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

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

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

    這篇文章主要介紹了JavaScript實現(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相比,它們有一些特殊的特點和用途,使它們在處理內(nèi)存泄漏問題、管理對象私有數(shù)據(jù)、處理對象的唯一性等場景中有顯著的優(yōu)勢,本文將深入探討WeakMap和WeakSet的特性和用途,一起看看吧
    2023-12-12
  • 微信小程序swiper使用網(wǎng)絡(luò)圖片不顯示問題解決

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

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

最新評論

平利县| 天柱县| 岳普湖县| 布拖县| 古交市| 深州市| 镇宁| 彰化县| 高青县| 朔州市| 长沙县| 花垣县| 凤山市| 盱眙县| 屏山县| 高安市| 松原市| 霍林郭勒市| 金沙县| 长兴县| 揭东县| 广南县| 阿拉善右旗| 蓬溪县| 交城县| 皮山县| 芷江| 奉化市| 鲜城| 太仆寺旗| 谷城县| 成安县| 耒阳市| 三原县| 阜阳市| 福贡县| 布尔津县| 盱眙县| 阿合奇县| 门头沟区| 普安县|