成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript異步調用框架的jQuery風格鏈式調用

開發 前端
本文描述JavaScript異步調用框架的鏈式調用。簡單的異步調用框架順序執行的異步函數需要用嵌套的方式來聲明。但在現實開發中,要按順序執行一系列的同步異步操作又是很常見的。這就需要設計一種新的操作方式來優化代碼可讀性。

我們已經實現了一個簡單的JavaScript異步調用框架,然而還有一些美中不足,那就是順序執行的異步函數需要用嵌套的方式來聲明。

現實開發中,要按順序執行一系列的同步異步操作又是很常見的。還是用百度Hi網頁版中的例子,我們先要異步獲取聯系人列表,然后再異步獲取每一個聯系人的具體信息,而且后者是分頁獲取的,每次請求發送10個聯系人的名稱然后取回對應的具體信息。這就是多個需要順序執行的異步請求。

為此,我們需要設計一種新的操作方式來優化代碼可讀性,讓順序異步操作代碼看起來和傳統的順序同步操作代碼一樣優雅。

傳統做法

大多數程序員都能夠很好的理解順序執行的代碼,例如這樣子的:

  1. var firstResult = firstOperation(initialArgument);  
  2. var secondResult = secondOperation(firstResult);  
  3. var finalResult = thirdOperation(secondResult);  
  4. alert(finalResult); 

其中先執行的函數為后執行的函數提供所需的數據。然而使用我們的JavaScript異步調用框架后,同樣的邏輯必須變成這樣子:

  1. firstAsyncOperation(initialArgument).addCallback(function(firstResult) {  
  2.   secondAsyncOperation(firstResult).addCallback(function(secondResult) {  
  3.     thirdAsyncOperation(secondResult).addCallback(function(finalResult) {    
  4.       alert(finalResult);  
  5.     });  
  6.   });  
  7. }); 

鏈式寫法

我認為上面的代碼實在是太不美觀了,并且希望能夠改造為jQuery風格的鏈式寫法。為此,我們先構造一個用例:

  1. Async.go(initialArgument)  
  2.   .next(firstAsyncOperation)  
  3.   .next(secondAsyncOperation)  
  4.   .next(thirdAsyncOperation)  
  5.   .next(function(finalResult) { alert(finalResult); }) 

在這個用例當中,我們在go傳入初始化數據,然后每一個next后面傳入一個數據處理函數,這些處理函數按順序對數據進行處理。

同步并存

上面的用例調用到的全部都是異步函數,不過我們***能夠兼容同步函數,讓使用者無需關心函數的具體實現,也能使用這項功能。為此我們再寫一個這樣的用例:

  1. Async.go(0)  
  2.   .next(function(i) { alert(i); return i + 1; })  
  3.   .next(function(i) {  
  4.     alert(i);  
  5.     var operation = new Async.Operation();  
  6.     setTimeout(function() { operation.yield(i + 1); }, 1000);  
  7.     return operation;  
  8.   })  
  9.   .next(function(i) { alert(i); return i + 1; })  
  10.   .next(function(i) { alert(i); return i; }); 

在上述用例中,我們期待能夠看到0, 1, 2, 3的提示信息序列,并且1和2之間間隔為1000毫秒。

異步本質

一個鏈式調用,本質上也是一個異步調用,所以它返回的也是一個Operation實例。這個實例自然也有result、state和completed這幾個字段,并且當整個鏈式調用完成時,result等于***一個調用返回的結果,而completed自然是等于true。

我們可以擴展一下上一個用例,得到如下用例代碼:

  1. var chainOperation = Async.go(0)  
  2.   .next(function(i) { alert(i); return i + 1; })  
  3.   .next(function(i) {  
  4.     alert(i);  
  5.     var operation = new Async.Operation();  
  6.     setTimeout(function() { operation.yield(i + 1); }, 1000);  
  7.     return operation;  
  8.   })  
  9.   .next(function(i) { alert(i); return i + 1; })  
  10.   .next(function(i) { alert(i); return i; });  
  11.  
  12. setTiemout(function() { alert(chainOperation.result; }, 2000);  

把鏈式調用的返回保存下來,在鏈式調用完成時,它的result應該與***一個操作的返回一致。在上述用例中,也就是3。

調用時機

盡管我們提供了一種鏈式調用方式,但是用戶不一定會按照這種固定的方式來調用,所以我們仍然要考慮兼容用戶的各種可能用法,例如說異步地用next往調用鏈添加操作:

  1. var chainOperation = Async.go(0);  
  2. chainOperation.next(function(i) { alert(i); return i + 1; });  
  3. setTimeout(function() {  
  4.   chainOperation.next(function(i) {  
  5.     alert(i);  
  6.     var operation = new Async.Operation();  
  7.     setTimeout(function() { operation.yield(i + 1); }, 2000);  
  8.     return operation;  
  9.   })  
  10. }, 1000);  
  11. setTimeout(function() {  
  12.   chainOperation.next(function(i) { alert(i); return i + 1; });  
  13. }, 2000); 

在這個用例當中,用戶每隔1000毫秒添加一個操作,而其中第二個操作耗時2000毫秒。也就是說,添加第三個操作時第二個操作還沒返回。作為一個健壯的框架,必須要能兼容這樣的使用方式。

此外我們還要考慮,用戶可能想要先構造調用鏈,然后再執行調用鏈。這時候用戶就會先使用next方法添加操作,再使用go方法執行。

  1. var chainOperation = Async  
  2.   .chain(function(i) { alert(i); return i + 1; })  
  3.   .next(function(i) {  
  4.     alert(i);  
  5.     var operation = new Async.Operation();  
  6.     setTimeout(function() { operation.yield(i + 1); }, 2000);  
  7.     return operation;  
  8.   })  
  9.   .go(0)  
  10. setTimeout(function() {  
  11.   chainOperation.next(function(i) { alert(i); return i + 1; })  
  12. }, 1000); 

在上述用例中,用戶通過chain和next添加了頭同步操作和異步操作各一個,然后用go執行調用鏈,在調用鏈執行完畢之前又用next異步追加了一個操作。一個健壯的框架,在這樣的用例當中應該能夠如同用戶所期望的那樣提示0, 1, 2。

小結

針對鏈式調用的需求,我們設計了如此多的用例,包括各種奇怪的JavaScript異步調用方式。具體實現方法,將在下文中講述。

【編輯推薦】

  1. JavaScript異步調用框架的代碼實現
  2. JavaScript異步調用框架用例設計
  3. JavaScript異步調用框架問題描述
  4. 淺談如何用Javascript+VML實現流程設計器
  5. 常用的JavaScript驗證正則表達式
責任編輯:yangsai 來源: Cat in dotNET
相關推薦

2009-07-01 14:37:14

JavaScript異

2009-07-01 13:58:00

JavaScript異

2009-07-01 14:23:46

JavaScript異

2009-07-01 14:05:23

JavaScript異

2011-03-02 08:57:22

jQueryJavaScript

2009-10-20 16:48:30

C#委托

2009-12-21 14:10:26

WCF異步調用

2009-11-09 10:50:30

WCF異步調用

2021-03-29 09:26:44

SpringBoot異步調用@Async

2009-11-06 15:54:15

WCF異步調用

2024-07-31 15:57:41

2024-10-15 10:28:43

2009-08-21 11:02:55

C#異步調用

2022-07-01 08:14:28

Dubbo異步代碼

2010-02-22 13:28:05

WCF異步調用

2009-08-21 11:24:16

C#異步調用

2009-12-07 14:35:42

WCF異步調用

2010-01-11 17:24:19

VB.NET異步調用

2012-10-29 10:59:27

Windows 8

2009-12-07 14:26:47

WCF異步調用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久夜色精品国产 | 天天天天操 | 欧美freesex黑人又粗又大 | 在线看片国产精品 | 精品久久久久久亚洲综合网 | 亚洲视频免费在线看 | 久久久久国产一级毛片高清网站 | 久热爱 | 一区二区三区福利视频 | 亚洲成a人片 | 成人在线| 成人精品高清 | 久久精品中文字幕 | 91毛片在线观看 | 人人九九精 | 精品视频在线观看 | av中文字幕网 | 国产精品久久久久久妇女6080 | 久久久国产一区 | 欧美一区二区三区久久精品 | 精品欧美一区二区在线观看欧美熟 | 黄色免费在线观看网址 | 99精品欧美一区二区三区综合在线 | 91高清在线观看 | 日韩欧美一二三区 | 日日夜夜精品视频 | 亚洲手机视频在线 | 欧美xxxx在线| 国产成人精品一区二区三 | 国产三级| 亚洲国产精品人人爽夜夜爽 | 久久99蜜桃综合影院免费观看 | 黄片毛片免费观看 | 国产精品爱久久久久久久 | 欧美一区免费 | 精品国产三级 | 人人看人人干 | 逼逼视频 | 91精品国产一区二区在线观看 | 欧美日韩视频一区二区 | 欧美成人猛片aaaaaaa |