中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

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

封裝Ajax
設(shè)計Async.Operation的最初目的就是解決Ajax調(diào)用需要傳遞callback參數(shù)的問題,為此我們先把Ajax請求封裝為Async.Operation。我在這里使用的是jQuery,當(dāng)然無論你用什么基礎(chǔ)庫,在使用Async.Operation時都可以做這種簡單的封裝。
復(fù)制代碼 代碼如下:
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;
};

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

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

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

首先我們看看較為基礎(chǔ)的get方法怎么寫:
復(fù)制代碼 代碼如下:
function get(name) {
return Ajax.get("/friend", "name=" + encodeURIComponent(name));
}

就這么簡單?對的,假如服務(wù)器端API返回的JSON結(jié)構(gòu)正好就是你要的好友對象結(jié)構(gòu)的話。如果JSON結(jié)構(gòu)和好友對象結(jié)構(gòu)是異構(gòu)的,或許你還要加點代碼來把JSON映射為對象:
復(fù)制代碼 代碼如下:
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接口只返回好友名稱列表,因此在取得這份列表后我們還要逐一調(diào)用get方法獲取具體的好友對象??紤]到在同時進行多個friend接口調(diào)用可能觸發(fā)服務(wù)器的防攻擊策略,導(dǎo)致被關(guān)小黑屋一段時間,所以對friend接口的調(diào)用必須排隊。
復(fù)制代碼 代碼如下:
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;
}

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

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

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

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

在原本next方法調(diào)用的匿名函數(shù)中手動加入setTimeout是一個辦法,但為什么我們不寫一個輔助函數(shù)來解決這類問題呢?讓我們來寫一個輔助方法并讓它和Async.Operation無縫結(jié)合起來。
復(fù)制代碼 代碼如下:
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的調(diào)用就可以了。
復(fù)制代碼 代碼如下:
for (var i = 0; i < json.length; i++) {
chain
.wait(500)
.next(function() {
return get(json.shift())
.addCallback(function(friend) { friends.push(friend); });
});
}

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

JavaScript技術(shù)JavaScript 異步調(diào)用框架 (Part 6 - 實例 &amp;amp; 模式),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久久91精品国产一区二区精品 | 在线播放国产一区二区三区 | 国产免费拔擦拔擦8x高清 | 久久69精品久久久久久久电影好 | 国产韩国精品一区二区三区 | 国产精品毛片一区二区三区 | 久久精品成人热国产成 | 国产精品久久久久久妇女6080 | 日韩亚洲欧美一区 | 欧美一区二区三区在线视频 | 精品免费国产视频 | a欧美| 国产精品一区二区视频 | 亚洲一区二区三区在线视频 | 成人免费毛片在线观看 | 成人欧美一区二区三区黑人孕妇 | 91偷拍精品一区二区三区 | 久久久久久91| 亚洲高清在线 | 91精品久久久久久久久久小网站 | 久久久亚洲综合 | 日本不卡高清视频 | 精品久久久久久久人人人人传媒 | 午夜不卡一区二区 | 一级片子| 精品av| 成人亚洲网站 | 色综合久久天天综合网 | 99免费精品 | 波多野结衣一区二区三区在线观看 | 一区二区视频在线 | 国产a区 | 99pao成人国产永久免费视频 | 久久亚洲一区二区 | 蜜桃精品视频在线 | 国产一区亚洲二区三区 | 国产日韩精品视频 | 国产一区精品在线 | 在线成人www免费观看视频 | 毛片综合 | 亚洲欧美在线观看 |