一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

JavaScript 異步調用框架 (Part 1 - 問題 & 場景)

問題
在Ajax應用中,調用XMLHttpRequest是很常見的情況。特別是以客戶端為中心的Ajax應用,各種需要從服務器端獲取數(shù)據(jù)的操作都通過XHR異步調用完成。然而在單線程的JavaScript編程中,XHR異步調用的代碼風格實在是與一般的JavaScript代碼格格不入。

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

function divide(operand1, operand2)

然而假設我們對客戶端除法的精度不滿意,于是把除法轉移到服務器端來執(zhí)行,那么它是個需要調用XHR的異步函數(shù),簽名也就可能會是以下幾種之一:
復制代碼 代碼如下:
function divide(operand1, operand2, callback)
function divide(operand1, operand2, successCallback, failureCallback)
function divide(operand1, operand2, options)


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

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

function calculate(operand1, operand2, operator)

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

function calculate(operand1, operand2, operator, callback)

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

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

這會帶來什么問題?calculate的調用者看到函數(shù)簽名自然會認為calculate是個異步函數(shù),因為它需要傳遞回調函數(shù),然而calculate的執(zhí)行方式卻是不確定的。考慮如下調用:

calculate(operand1, operand2, operator, callback);
next();

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

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

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

然而后面一種做法依賴于成本較高的實現(xiàn)方式,開發(fā)者一個不小心(或者擺明偷懶)就會漏掉setTimeout,導致函數(shù)調用順序變得不確定,所以我們會希望這是框架幫助實現(xiàn)的功能,在使用框架時無法把這繞過。

場景
在這里,我舉一個關于上述問題的具體應用場景。(為簡化問題,描述已略作修改,與實際應用并不一致。)

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

用戶對象未緩存
異步讀取用戶信息
用戶對象已緩存
用戶是好友(信息更新會由服務器端推送)
同步讀取用戶信息
用戶不是好友(信息更新需要由客戶端拉取)
可以接受緩存信息
同步讀取用戶信息
必須獲取最新信息
異步讀取用戶信息
可以看到,分支的結果最終既有同步的,也有異步的。并且這些分支還不是在一個函數(shù)里完成,而是在幾個函數(shù)里實現(xiàn)。也就是說,按照傳統(tǒng)的模式,這些函數(shù)一部分是同步的,一部分是異步的,由于異步的傳遞性,最終調用棧頂層的函數(shù)都是異步的。

為了解決這個問題,我們需要寫一個異步調用框架,用一種統(tǒng)一的方式來進行調用,把同步和異步調用都合并為一種返回方式。

JavaScript技術JavaScript 異步調用框架 (Part 1 - 問題 & 場景),轉載需保留來源!

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

主站蜘蛛池模板: 黄网在线播放 | www.91自拍| 中文字幕1区 | 国产一区二区网站 | 精品玖玖| 国产精品福利无圣光一区二区 | 日韩有色 | 国产精品色午夜视频免费看 | 五月亭亭激情五月 | 国产乱码精品一区二区三上 | 99久女女精品视频在线观看 | 男女朋友做爽爽爽免费视频网 | 久久综合九色综合97婷婷女人 | 999国产视频| 在线播放亚洲视频 | 成人午夜视频一区二区国语 | 91久久国产视频 | 久久久精品2018免费观看 | 欧美国产一区二区二区 | 91亚洲国产成人久久精品网址 | 亚州第一视频 | 自拍毛片| 色一涩| 精品久久久久久综合日本 | 亚洲图片天堂 | 欧美综合一区二区三区 | sihu国产午夜精品一区二区三区 | ye321夜色资源网站 | 麻豆精品国产自产在线 | 婷婷丁香在线观看 | 香蕉成人啪国产精品视频综合网 | 久久久久久久成人午夜精品福利 | 91久久精品日日躁夜夜躁欧美 | 国产一区二区三区精品视频 | 四虎影视国产精品永久在线 | 看全色黄大色黄大片免责看的 | 伊人中文字幕在线观看 | 国产激情在线 | 国产精品极品美女自在线看免费一区二区 | 最新丁香六月 | 伊人第一页 |