自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 前端
本文提供了JavaScript異步調(diào)用框架的代碼實(shí)現(xiàn)。我們將實(shí)現(xiàn)一個(gè)用于JavaScript異步調(diào)用的Async.Operation類,通過addCallback方法傳遞回調(diào)函數(shù),并且通過yield方法返回回調(diào)結(jié)果。

在上一篇文章里,我們說到了要實(shí)現(xiàn)一個(gè)用于JavaScript異步調(diào)用的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é)果。

  1. Async = {  
  2.   Operation: {  
  3.     var callbackQueue = [];  
  4.     this.result = undefined;  
  5.     this.state = "waiting";  
  6.     this.completed = false;  
  7.   }  

addCallback方法

接下來,我們要實(shí)現(xiàn)addCallback方法,它的工作職責(zé)很簡(jiǎn)單,就是把回調(diào)函數(shù)放到callbackQueue中。此外,如果此時(shí)completed為true,說明異步操作已經(jīng)yield過了,則立即調(diào)用此回調(diào)。

  1. this.yield = function(callback) {  
  2.   callbackQueue.push(callback);  
  3.   if (this.completed) {  
  4.     this.yield(this.result);  
  5.   }  
  6.   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ù)來實(shí)現(xiàn)JavaScript異步調(diào)用:

  1. asyncOperation(argument)  
  2.   .addCallback(firstCallback)  
  3.   .addCallback(secondCallback); 

yield方法

最后,我們要實(shí)現(xiàn)yield方法。它需要將callbackQueue中的回調(diào)函數(shù)逐個(gè)取出來,然后都調(diào)用一遍,并且保證這個(gè)操作是異步吧。

  1. this.yield = function(result) {  
  2.   var self = this;  
  3.   setTimeout(function() {  
  4.     self.result = result;  
  5.     self.state = "completed";  
  6.     self.completed = true;  
  7.     while (callbackQueue.length > 0) {  
  8.       var callback = callbackQueue.shift();  
  9.       callback(self.result);  
  10.     }  
  11.   }, 1);  
  12.   return this;  

通過使用setTimeout,我們確保了yield的實(shí)際操作是異步進(jìn)行的。然后我們把用戶傳入yield的結(jié)果及相關(guān)狀態(tài)更新到對(duì)象屬性之上,最后遍歷callbackQueue調(diào)用所有的回調(diào)函數(shù)。

小結(jié)

這樣我們就做好了一個(gè)簡(jiǎn)單的JavaScript異步調(diào)用框架,完整的代碼如下:

  1. Async = {  
  2.     Operation: function() {  
  3.         var callbackQueue = [];  
  4.         this.result = undefined;  
  5.         this.state = "running";  
  6.         this.completed = false;  
  7.  
  8.         this.yield = function(result) {  
  9.             var self = this;  
  10.             setTimeout(function() {  
  11.                 self.result = result;  
  12.                 self.state = "completed";  
  13.                 self.completed = true;  
  14.  
  15.                 while (callbackQueue.length > 0) {  
  16.                     var callback = callbackQueue.shift();  
  17.                     callback(self.result);  
  18.                 }  
  19.             }, 1);  
  20.             return this;  
  21.         };  
  22.  
  23.         this.addCallback = function(callback) {  
  24.             callbackQueue.push(callback);  
  25.             if (this.completed) {  
  26.                 this.yield(this.result);  
  27.             }  
  28.             return this;  
  29.         };  
  30.     }  
  31. }; 

這個(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ì)變得越來越不美觀:

  1. firstAsyncOperation().addCallback(function() {  
  2.   secondAsyncOperation().addCallback(function() {  
  3.     thirdAsyncOperation().addCallback(function() {  
  4.       finalSyncOperation();  
  5.     });  
  6.   });  
  7. }); 

我們能否把嵌套形式改為jQuery風(fēng)格的鏈?zhǔn)綄懛??這是我們接下來要思考的問題。

【編輯推薦】

  1. JavaScript異步調(diào)用框架用例設(shè)計(jì)
  2. JavaScript異步調(diào)用框架問題描述
  3. 淺談如何用Javascript+VML實(shí)現(xiàn)流程設(shè)計(jì)器
  4. 常用的JavaScript驗(yàn)證正則表達(dá)式
  5. 給JavaScript初學(xué)者的24個(gè)小竅門
責(zé)任編輯:yangsai 來源: Cat in dotNET
相關(guān)推薦

2009-07-01 14:37:14

JavaScript異

2009-07-01 13:58:00

JavaScript異

2009-07-01 14:31:01

JavaScript異

2009-07-01 14:05:23

JavaScript異

2009-10-20 16:48:30

C#委托

2010-01-11 17:24:19

VB.NET異步調(diào)用

2009-08-21 11:24:16

C#異步調(diào)用

2024-08-12 10:13:01

2022-09-27 12:01:56

Spring異步調(diào)用方式

2010-02-25 09:13:34

WCF異步調(diào)用

2009-12-21 14:10:26

WCF異步調(diào)用

2009-11-09 10:50:30

WCF異步調(diào)用

2010-03-01 14:01:50

WCF服務(wù)異步調(diào)用

2021-03-29 09:26:44

SpringBoot異步調(diào)用@Async

2022-09-28 14:54:07

Spring注解方式線程池

2024-07-31 15:57:41

2024-10-15 10:28:43

2009-11-06 15:54:15

WCF異步調(diào)用

2009-08-21 11:02:55

C#異步調(diào)用

2022-07-01 08:14:28

Dubbo異步代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)