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

JavaScript 異步調(diào)用框架 (Part 4 - 鏈?zhǔn)秸{(diào)用)

 更新時(shí)間:2009年08月04日 00:09:52   作者:  
我們已經(jīng)實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的異步調(diào)用框架,然而還有一些美中不足,那就是順序執(zhí)行的異步函數(shù)需要用嵌套的方式來(lái)聲明。
現(xiàn)實(shí)開(kāi)發(fā)中,要按順序執(zhí)行一系列的同步異步操作又是很常見(jiàn)的。還是用百度Hi網(wǎng)頁(yè)版中的例子,我們先要異步獲取聯(lián)系人列表,然后再異步獲取每一個(gè)聯(lián)系人的具體信息,而且后者是分頁(yè)獲取的,每次請(qǐng)求發(fā)送10個(gè)聯(lián)系人的名稱(chēng)然后取回對(duì)應(yīng)的具體信息。這就是多個(gè)需要順序執(zhí)行的異步請(qǐng)求。
為此,我們需要設(shè)計(jì)一種新的操作方式來(lái)優(yōu)化代碼可讀性,讓順序異步操作代碼看起來(lái)和傳統(tǒng)的順序同步操作代碼一樣優(yōu)雅。
傳統(tǒng)做法
大多數(shù)程序員都能夠很好的理解順序執(zhí)行的代碼,例如這樣子的:
復(fù)制代碼 代碼如下:

var firstResult = firstOperation(initialArgument);
var secondResult = secondOperation(firstResult);
var finalResult = thirdOperation(secondResult);
alert(finalResult);

其中先執(zhí)行的函數(shù)為后執(zhí)行的函數(shù)提供所需的數(shù)據(jù)。然而使用我們的異步調(diào)用框架后,同樣的邏輯必須變成這樣子:
復(fù)制代碼 代碼如下:

firstAsyncOperation(initialArgument).addCallback(function(firstResult) {
secondAsyncOperation(firstResult).addCallback(function(secondResult) {
thirdAsyncOperation(secondResult).addCallback(function(finalResult) {
alert(finalResult);
});
});
});

鏈?zhǔn)綄?xiě)法
我認(rèn)為上面的代碼實(shí)在是太不美觀(guān)了,并且希望能夠改造為jQuery風(fēng)格的鏈?zhǔn)綄?xiě)法。為此,我們先構(gòu)造一個(gè)用例:
復(fù)制代碼 代碼如下:

Async.go(initialArgument)
.next(firstAsyncOperation)
.next(secondAsyncOperation)
.next(thirdAsyncOperation)
.next(function(finalResult) { alert(finalResult); })

在這個(gè)用例當(dāng)中,我們?cè)趃o傳入初始化數(shù)據(jù),然后每一個(gè)next后面?zhèn)魅胍粋€(gè)數(shù)據(jù)處理函數(shù),這些處理函數(shù)按順序?qū)?shù)據(jù)進(jìn)行處理。
同步并存
上面的用例調(diào)用到的全部都是異步函數(shù),不過(guò)我們最好能夠兼容同步函數(shù),讓使用者無(wú)需關(guān)心函數(shù)的具體實(shí)現(xiàn),也能使用這項(xiàng)功能。為此我們?cè)賹?xiě)一個(gè)這樣的用例:
復(fù)制代碼 代碼如下:

Async.go(0)
.next(function(i) { alert(i); return i + 1; })
.next(function(i) {
alert(i);
var operation = new Async.Operation();
setTimeout(function() { operation.yield(i + 1); }, 1000);
return operation;
})
.next(function(i) { alert(i); return i + 1; })
.next(function(i) { alert(i); return i; });

在上述用例中,我們期待能夠看到0, 1, 2, 3的提示信息序列,并且1和2之間間隔為1000毫秒。
異步本質(zhì)
一個(gè)鏈?zhǔn)秸{(diào)用,本質(zhì)上也是一個(gè)異步調(diào)用,所以它返回的也是一個(gè)Operation實(shí)例。這個(gè)實(shí)例自然也有result、state和completed這幾個(gè)字段,并且當(dāng)整個(gè)鏈?zhǔn)秸{(diào)用完成時(shí),result等于最后一個(gè)調(diào)用返回的結(jié)果,而completed自然是等于true。
我們可以擴(kuò)展一下上一個(gè)用例,得到如下用例代碼:
復(fù)制代碼 代碼如下:

var chainOperation = Async.go(0)
.next(function(i) { alert(i); return i + 1; })
.next(function(i) {
alert(i);
var operation = new Async.Operation();
setTimeout(function() { operation.yield(i + 1); }, 1000);
return operation;
})
.next(function(i) { alert(i); return i + 1; })
.next(function(i) { alert(i); return i; });
setTiemout(function() { alert(chainOperation.result; }, 2000);

把鏈?zhǔn)秸{(diào)用的返回保存下來(lái),在鏈?zhǔn)秸{(diào)用完成時(shí),它的result應(yīng)該與最后一個(gè)操作的返回一致。在上述用例中,也就是3。
調(diào)用時(shí)機(jī)
盡管我們提供了一種鏈?zhǔn)秸{(diào)用方式,但是用戶(hù)不一定會(huì)按照這種固定的方式來(lái)調(diào)用,所以我們?nèi)匀灰紤]兼容用戶(hù)的各種可能用法,例如說(shuō)異步地用next往調(diào)用鏈添加操作:
復(fù)制代碼 代碼如下:

var chainOperation = Async.go(0);
chainOperation.next(function(i) { alert(i); return i + 1; });
setTimeout(function() {
chainOperation.next(function(i) {
alert(i);
var operation = new Async.Operation();
setTimeout(function() { operation.yield(i + 1); }, 2000);
return operation;
})
}, 1000);
setTimeout(function() {
chainOperation.next(function(i) { alert(i); return i + 1; });
}, 2000);

在這個(gè)用例當(dāng)中,用戶(hù)每隔1000毫秒添加一個(gè)操作,而其中第二個(gè)操作耗時(shí)2000毫秒。也就是說(shuō),添加第三個(gè)操作時(shí)第二個(gè)操作還沒(méi)返回。作為一個(gè)健壯的框架,必須要能兼容這樣的使用方式。
此外我們還要考慮,用戶(hù)可能想要先構(gòu)造調(diào)用鏈,然后再執(zhí)行調(diào)用鏈。這時(shí)候用戶(hù)就會(huì)先使用next方法添加操作,再使用go方法執(zhí)行。
復(fù)制代碼 代碼如下:

var chainOperation = Async
.chain(function(i) { alert(i); return i + 1; })
.next(function(i) {
alert(i);
var operation = new Async.Operation();
setTimeout(function() { operation.yield(i + 1); }, 2000);
return operation;
})
.go(0)
setTimeout(function() {
chainOperation.next(function(i) { alert(i); return i + 1; })
}, 1000);

在上述用例中,用戶(hù)通過(guò)chain和next添加了頭同步操作和異步操作各一個(gè),然后用go執(zhí)行調(diào)用鏈,在調(diào)用鏈執(zhí)行完畢之前又用next異步追加了一個(gè)操作。一個(gè)健壯的框架,在這樣的用例當(dāng)中應(yīng)該能夠如同用戶(hù)所期望的那樣提示0, 1, 2。
小結(jié)
針對(duì)鏈?zhǔn)秸{(diào)用的需求,我們?cè)O(shè)計(jì)了如此多的用例,包括各種奇怪的異步調(diào)用方式。最終如何實(shí)現(xiàn)這樣的功能呢?

相關(guān)文章

  • 小程序列表懶加載的實(shí)現(xiàn)方式

    小程序列表懶加載的實(shí)現(xiàn)方式

    懶加載,前端人都知道的一種性能優(yōu)化方式,簡(jiǎn)單的來(lái)說(shuō),只有當(dāng)圖片出現(xiàn)在瀏覽器的可視區(qū)域內(nèi)時(shí),才設(shè)置圖片正真的路徑,讓圖片顯示出來(lái),這篇文章主要給大家介紹了關(guān)于小程序列表懶加載的實(shí)現(xiàn)方式,需要的朋友可以參考下
    2022-04-04
  • 微信小程序云開(kāi)發(fā)之新手環(huán)境配置

    微信小程序云開(kāi)發(fā)之新手環(huán)境配置

    這篇文章主要為大家詳細(xì)介紹了微信小程序云開(kāi)發(fā)之新手環(huán)境配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • JS清空多文本框、文本域示例代碼

    JS清空多文本框、文本域示例代碼

    點(diǎn)擊按鈕清空頁(yè)面上所有的文本框、文本域,下面有個(gè)不錯(cuò)的示例,大家可以參考下其具體實(shí)現(xiàn)
    2014-02-02
  • javascript的函數(shù)

    javascript的函數(shù)

    javascript的函數(shù)...
    2006-07-07
  • 利用CSS、JavaScript及Ajax實(shí)現(xiàn)高效的圖片預(yù)加載

    利用CSS、JavaScript及Ajax實(shí)現(xiàn)高效的圖片預(yù)加載

    圖片預(yù)加載想必大家都不陌生吧,實(shí)現(xiàn)預(yù)加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術(shù)可根據(jù)不同設(shè)計(jì)場(chǎng)景設(shè)計(jì)出相應(yīng)的解決方案,十分高效
    2013-10-10
  • 微信小程序使用component自定義toast彈窗效果

    微信小程序使用component自定義toast彈窗效果

    這篇文章主要介紹了微信小程序使用component自定義toast彈窗效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解

    對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解

    今天小編就為大家分享一篇對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • 如何獲取元素的最終background-color

    如何獲取元素的最終background-color

    本文主要介紹了如何獲取元素的最終background-color的方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • SWFObject 2.1以上版本語(yǔ)法介紹

    SWFObject 2.1以上版本語(yǔ)法介紹

    用SWFObject 插入flash,好處多多,代碼簡(jiǎn)潔,不會(huì)出現(xiàn)微軟的“單擊此處以激活控件”的提示(據(jù)可靠消息,這個(gè)是微軟惹的官司,其結(jié)果是害苦了用戶(hù))。
    2010-07-07
  • js中indexof的用法詳細(xì)解析

    js中indexof的用法詳細(xì)解析

    本篇文章主要是對(duì)js中indexof的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12

最新評(píng)論