欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 異步調用框架 (Part 6 - 實例 & 模式)

 更新時間:2009年08月04日 00:15:42   作者:  
我們用了5篇文章來討論如何編寫一個JavaScript異步調用框架(問題 & 場景、用例設計、代碼實現(xiàn)、鏈式調用、鏈式實現(xiàn)),現(xiàn)在是時候讓我們看一下在各種常見開發(fā)情景中如何使用它了。
封裝Ajax
設計Async.Operation的最初目的就是解決Ajax調用需要傳遞callback參數(shù)的問題,為此我們先把Ajax請求封裝為Async.Operation。我在這里使用的是jQuery,當然無論你用什么基礎庫,在使用Async.Operation時都可以做這種簡單的封裝。
復制代碼 代碼如下:

var Ajax = {};

Ajax.get = function(url, data) {
var operation = new Async.Operation();
$.get(url, data, function(result) { operation.yield(result); }, "json");
return operation;
};

Ajax.post = function(url, data) {
var operation = new Async.Operation();
$.post(url, data, function(result) { operation.yield(result); }, "json");
return operation;
};

在我所調用的服務器端API中,只需要GET和POST,且數(shù)據(jù)都為JSON,所以我就直接把jQuery提供的其它Ajax選項屏蔽掉了,并設置數(shù)據(jù)類型為JSON。在你的項目當中,也可以用類似的方式將Ajax封裝為若干僅僅返回Async.Operation的方法,將jQuery提供的選項都封裝在Ajax這一層內(nèi),不再向上層暴露這些選項。

調用Ajax
把Ajax封裝好后,我們就可以開始專心寫業(yè)務邏輯了。

假設我們有一個Friend對象,它的get方法用于返回單個好友對象,而getAll方法用于返回所有好友對象。于此對應的是兩個服務器端API,friend接口會返回單個好友JSON,而friendlist接口會返回所有好友名稱組成的JSON。

首先我們看看較為基礎的get方法怎么寫:
復制代碼 代碼如下:

function get(name) {
return Ajax.get("/friend", "name=" + encodeURIComponent(name));
}

就這么簡單?對的,假如服務器端API返回的JSON結構正好就是你要的好友對象結構的話。如果JSON結構和好友對象結構是異構的,或許你還要加點代碼來把JSON映射為對象:
復制代碼 代碼如下:

function get(name) {
var operation = new Async.Operation()
Ajax.get("/friend", "name=" + encodeURIComponent(name))
.addCallback(function(json) {
operation.yield(createFriendFromJson(json));
});
return operation;
}

Ajax隊列
接下來我們要編寫的是getAll方法。因為friendlist接口只返回好友名稱列表,因此在取得這份列表后我們還要逐一調用get方法獲取具體的好友對象??紤]到在同時進行多個friend接口調用可能觸發(fā)服務器的防攻擊策略,導致被關小黑屋一段時間,所以對friend接口的調用必須排隊。
復制代碼 代碼如下:

function getAll(){
var operation = new Async.Operation();
var friends = [];
var chain = Async.chain();
Ajax.get("/friendlist", "")
.addCallback(function(json) {
for (var i = 0; i < json.length; i++) {
chain.next(function() {
return get(json.shift())
.addCallback(function(friend) { friends.push(friend); });
});
}
chain
.next(function() { operation.yield(friends); })
.go();
})
return operation;
}

在這里,我們假設friendlist接口返回的JSON就是一個Array,在獲取到這個Array后構造一個等長的異步調用隊列,其中每一個調用的邏輯都是一樣的——取出Array中首個好友的名稱,用get方法獲取對應的好友對象,再將好友對象放入另一個Array中。在調用隊列的末端,我們再追加了一個調用,用于返回保存好友對象的Array。

在這個例子當中,我們沒有利用調用隊列會把上一個函數(shù)的結果傳遞給下一個函數(shù)的特性,不過也足夠展示調用隊列的用途了——讓多個底層為Ajax請求的異步操作按照固定的順序阻塞式執(zhí)行。

由于底層異步函數(shù)返回的就是Async.Operation,你可以直接把它傳遞給next方法,也可以用匿名函數(shù)包裝后傳遞給next方法,而匿名函數(shù)內(nèi)部只需要一個return。

延時函數(shù)
在上面的例子中,使用隊列是為了避免觸發(fā)服務器的防攻擊策略,但有時候這還是不夠的。例如說,服務器要求兩個請求之間至少間隔500毫秒,否則就認為是攻擊,那么我們就要在隊列里面插入這個間隔了。

在原本next方法調用的匿名函數(shù)中手動加入setTimeout是一個辦法,但為什么我們不寫一個輔助函數(shù)來解決這類問題呢?讓我們來寫一個輔助方法并讓它和Async.Operation無縫結合起來。
復制代碼 代碼如下:

Async.wait = function(delay, context) {
var operation = new Async.Operation();
setTimeout(function() { operation.yield(context); }, delay);
return operation;
};

Async.Operation.prototype.wait = function(delay, context) {
this.next(function(context) { return Async.wait(delay, context); });
}

在有了這個輔助方法后,我們就可以在上述getAll方法中輕松實現(xiàn)在每個Ajax請求之間間隔500毫秒。在for循環(huán)內(nèi)的加上對wait的調用就可以了。
復制代碼 代碼如下:

for (var i = 0; i < json.length; i++) {
chain
.wait(500)
.next(function() {
return get(json.shift())
.addCallback(function(friend) { friends.push(friend); });
});
}

小結
通過一些簡單的例子,我們了解到了Async.Operation常見的使用方式,以及在有需要的時候如何擴展它的功能。希望Async.Operation能夠有效幫助大家提高Ajax應用的代碼可讀性。

相關文章

  • TypeScript 類型編程之索引類型遞歸去掉可選修飾

    TypeScript 類型編程之索引類型遞歸去掉可選修飾

    這篇文章主要介紹了TypeScript 類型編程之索引類型遞歸去掉可選修飾,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Bootstrap按鈕功能之查詢按鈕和重置按鈕

    Bootstrap按鈕功能之查詢按鈕和重置按鈕

    一般情況下,查詢列表有查詢條件、查詢按鈕和重置按鈕,輸入查詢條件,點擊查詢按鈕查詢列表等數(shù)據(jù);點擊重置按鈕會將查詢條件恢復到原始狀態(tài)。接下來通過本文給大家介紹bootstrap實現(xiàn)查詢按鈕和重置按鈕的方法,一起看看吧
    2016-10-10
  • 你不知道的高性能JAVASCRIPT

    你不知道的高性能JAVASCRIPT

    想必大家都知道,JavaScrip是全棧開發(fā)語言,瀏覽器,手機,服務器端都可以看到JS的身影。 本文會分享一些高效的JavaScript的最佳實踐,提高大家對JS的底層和實現(xiàn)原理的理解,感興趣的小伙伴們可以參考一下
    2016-01-01
  • BOM操作querySelector?querySeletorAll獲取標簽對象

    BOM操作querySelector?querySeletorAll獲取標簽對象

    這篇文章主要為大家介紹了BOM操作querySelector?querySeletorAll獲取標簽對象步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Array.prototype 的泛型應用分析

    Array.prototype 的泛型應用分析

    Array.prototype 的泛型應用分析,需要的朋友可以參考下。
    2010-04-04
  • JS實現(xiàn)關閉小廣告特效

    JS實現(xiàn)關閉小廣告特效

    這篇文章主要為大家詳細介紹了JS實現(xiàn)關閉小廣告特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 原生JS實現(xiàn)幻燈片

    原生JS實現(xiàn)幻燈片

    本文主要介紹了原生JS實現(xiàn)幻燈片的示例代碼,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JS 對輸入框進行限制(常用的都有)

    JS 對輸入框進行限制(常用的都有)

    本文為大家介紹下使用js對輸入框進行限制:文本框只能輸入數(shù)字代碼、只能輸入數(shù)字、只能輸入字母和漢字、只能輸入英文字母和數(shù)字等等,還有很多,感興趣的可以學習下
    2013-07-07
  • layui實現(xiàn)tab的添加拒絕重復的方法

    layui實現(xiàn)tab的添加拒絕重復的方法

    今天小編就為大家分享一篇layui實現(xiàn)tab的添加拒絕重復的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • js寫的評論分頁(還不錯)

    js寫的評論分頁(還不錯)

    js寫的分頁在網(wǎng)上可以搜到很多的文章,在也為大家介紹一個,喜歡的的朋友可以參考下
    2013-12-12

最新評論