日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
JavaScript異步調(diào)用框架問(wèn)題描述

問(wèn)題

創(chuàng)新互聯(lián)建站是一家專(zhuān)注于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),通州網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:通州等地區(qū)。通州做網(wǎng)站價(jià)格咨詢(xún):028-86922220

在Ajax應(yīng)用中,調(diào)用XMLHttpRequest是很常見(jiàn)的情況。特別是以客戶(hù)端為中心的Ajax應(yīng)用,各種需要從服務(wù)器端獲取數(shù)據(jù)的操作都通過(guò)XHR異步調(diào)用完成。然而在單線(xiàn)程的JavaScript編程中,XHR異步調(diào)用的代碼風(fēng)格實(shí)在是與一般的JavaScript代碼格格不入。這樣就產(chǎn)生了對(duì)JavaScript異步調(diào)用的需求。

額外參數(shù)

考慮一個(gè)除法函數(shù),如果它是純客戶(hù)端的同步函數(shù),那么簽名會(huì)是這樣的:

function divide(operand1, operand2)

然而假設(shè)我們對(duì)客戶(hù)端除法的精度不滿(mǎn)意,于是把除法轉(zhuǎn)移到服務(wù)器端來(lái)執(zhí)行,那么它是個(gè)需要調(diào)用XHR的異步函數(shù),簽名也就可能會(huì)是以下幾種之一:

function divide(operand1, operand2, callback)

function divide(operand1, operand2, successCallback, failureCallback)

function divide(operand1, operand2, options)

我們必須在簽名中引入新的參數(shù)來(lái)傳遞回調(diào)函數(shù),不能選擇讓函數(shù)變成阻塞式的同步調(diào)用。

可傳遞性

不僅僅直接操作XHR的函數(shù)需要引入新的參數(shù),這種復(fù)雜性還會(huì)順著調(diào)用棧向外傳遞。例如說(shuō),我們對(duì)加減乘除四則運(yùn)算作了封裝,只向外暴露一個(gè)運(yùn)算接口:

function calculate(operand1, operand2, operator)

這個(gè)calculate函數(shù)根據(jù)operator參數(shù)來(lái)調(diào)用內(nèi)部的plus, subtract, multiply, divide函數(shù)。然而,因?yàn)閐ivide函數(shù)變成了異步函數(shù),所以整個(gè)calculate函數(shù)不得不也轉(zhuǎn)變?yōu)楫惒胶瘮?shù):

function calculate(operand1, operand2, operator, callback)

同時(shí),在調(diào)用棧之上凡是需要調(diào)用到calculate的函數(shù),都必須變成異步的,除非它并不需要向上一級(jí)調(diào)用函數(shù)返回結(jié)果。

同步并存

盡管calculate函數(shù)變成了一個(gè)異步函數(shù),它所調(diào)用的plus, subtract, multiply函數(shù)還是同步函數(shù),只有調(diào)用divide時(shí)是異步的,這時(shí)候calculate就是一個(gè)異步同步并存函數(shù)。

這會(huì)帶來(lái)什么問(wèn)題?calculate的調(diào)用者看到函數(shù)簽名自然會(huì)認(rèn)為calculate是個(gè)異步函數(shù),因?yàn)樗枰獋鬟f回調(diào)函數(shù),然而calculate的執(zhí)行方式卻是不確定的??紤]如下調(diào)用:

calculate(operand1, operand2, operator, callback);

next();

這里涉及到callback和next兩個(gè)函數(shù),它們哪個(gè)先執(zhí)行哪個(gè)后執(zhí)行是不確定的,或者說(shuō)是依賴(lài)于calculate具體實(shí)現(xiàn)的。

如果calculate的實(shí)現(xiàn)是,當(dāng)不需要進(jìn)行異步操作時(shí),直接調(diào)用callback。那么,在執(zhí)行加減乘法時(shí)callback會(huì)在next之前被調(diào)用;在執(zhí)行除法時(shí)next會(huì)在callback之前調(diào)用。

如果我們不喜歡這種不確定性,我們可以改變一下calculate的實(shí)現(xiàn),把同步調(diào)用也都改為setTimeout形式的,這樣在任何情況下next都一定會(huì)在callback之前被調(diào)用。

然而后面一種做法依賴(lài)于成本較高的實(shí)現(xiàn)方式,開(kāi)發(fā)者一個(gè)不小心(或者擺明偷懶)就會(huì)漏掉setTimeout,導(dǎo)致函數(shù)調(diào)用順序變得不確定,所以我們會(huì)希望這是框架幫助實(shí)現(xiàn)的功能,在使用框架時(shí)無(wú)法把這繞過(guò)。這些都指向?qū)avaScript異步調(diào)用的需求。

場(chǎng)景

在這里,我舉一個(gè)關(guān)于上述問(wèn)題的具體應(yīng)用場(chǎng)景。(為簡(jiǎn)化問(wèn)題,描述已略作修改,與實(shí)際應(yīng)用并不一致。)

在百度Hi網(wǎng)頁(yè)版里面,我們會(huì)在客戶(hù)端保存一個(gè)用戶(hù)對(duì)象列表,在打開(kāi)和這個(gè)用戶(hù)的聊天窗口時(shí),我們需要從中讀取這個(gè)用戶(hù)的信息。這個(gè)操作就涉及很多可能同步又可能異步的分支:

◆用戶(hù)對(duì)象未緩存

◆異步讀取用戶(hù)信息

◆用戶(hù)對(duì)象已緩存

◆用戶(hù)是好友(信息更新會(huì)由服務(wù)器端推送)

◆同步讀取用戶(hù)信息

◆用戶(hù)不是好友(信息更新需要由客戶(hù)端拉?。?/p>

◆可以接受緩存信息

◆同步讀取用戶(hù)信息

◆必須獲取最新信息

◆異步讀取用戶(hù)信息

可以看到,分支的結(jié)果最終既有同步的,也有異步的。并且這些分支還不是在一個(gè)函數(shù)里完成,而是在幾個(gè)函數(shù)里實(shí)現(xiàn)。也就是說(shuō),按照傳統(tǒng)的模式,這些函數(shù)一部分是同步的,一部分是異步的,由于異步的傳遞性,最終調(diào)用棧頂層的函數(shù)都是異步的。

為了解決這個(gè)問(wèn)題,我們需要寫(xiě)一個(gè)JavaScript異步調(diào)用框架,用一種統(tǒng)一的方式來(lái)進(jìn)行調(diào)用,把同步和異步調(diào)用都合并為一種返回方式。


網(wǎng)頁(yè)題目:JavaScript異步調(diào)用框架問(wèn)題描述
文章來(lái)源:http://www.5511xx.com/article/dhdihdj.html