<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript異步調(diào)用框架(Part1-問題&amp;場景)_javascript技巧

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 20:43:49
        文檔

        JavaScript異步調(diào)用框架(Part1-問題&場景)_javascript技巧

        JavaScript異步調(diào)用框架(Part1-問題&場景)_javascript技巧:問題 在Ajax應(yīng)用中,調(diào)用XMLHttpRequest是很常見的情況。特別是以客戶端為中心的Ajax應(yīng)用,各種需要從服務(wù)器端獲取數(shù)據(jù)的操作都通過XHR異步調(diào)用完成。然而在單線程的JavaScript編程中,XHR異步調(diào)用的代碼風(fēng)格實(shí)在是與一般的JavaScript代碼格格不入
        推薦度:
        導(dǎo)讀JavaScript異步調(diào)用框架(Part1-問題&場景)_javascript技巧:問題 在Ajax應(yīng)用中,調(diào)用XMLHttpRequest是很常見的情況。特別是以客戶端為中心的Ajax應(yīng)用,各種需要從服務(wù)器端獲取數(shù)據(jù)的操作都通過XHR異步調(diào)用完成。然而在單線程的JavaScript編程中,XHR異步調(diào)用的代碼風(fēng)格實(shí)在是與一般的JavaScript代碼格格不入

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

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

        function divide(operand1, operand2)

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

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

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

        function calculate(operand1, operand2, operator)

        這個(gè)calculate函數(shù)根據(jù)operator參數(shù)來調(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ù),都必須變成異步的,除非它并不需要向上一級調(diào)用函數(shù)返回結(jié)果。

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

        這會帶來什么問題?calculate的調(diào)用者看到函數(shù)簽名自然會認(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í)行是不確定的,或者說是依賴于calculate具體實(shí)現(xiàn)的。

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

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

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

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

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

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

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript異步調(diào)用框架(Part1-問題&場景)_javascript技巧

        JavaScript異步調(diào)用框架(Part1-問題&場景)_javascript技巧:問題 在Ajax應(yīng)用中,調(diào)用XMLHttpRequest是很常見的情況。特別是以客戶端為中心的Ajax應(yīng)用,各種需要從服務(wù)器端獲取數(shù)據(jù)的操作都通過XHR異步調(diào)用完成。然而在單線程的JavaScript編程中,XHR異步調(diào)用的代碼風(fēng)格實(shí)在是與一般的JavaScript代碼格格不入
        推薦度:
        標(biāo)簽: 問題 場景 javascript
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: www视频免费看| 野花香高清视频在线观看免费 | 中文字幕视频免费在线观看| 亚洲第一页综合图片自拍| 美美女高清毛片视频黄的一免费 | 青青久久精品国产免费看| 国产精品冒白浆免费视频| 色天使亚洲综合一区二区| 免费看男女下面日出水视频| 一本到卡二卡三卡免费高| 亚洲啪啪AV无码片| 免费人成视频在线观看网站 | 久久精品国产精品亚洲下载| 国产又黄又爽又大的免费视频| 亚洲va无码手机在线电影| 一级做a爰全过程免费视频| 久久精品国产亚洲AV久| 日日夜夜精品免费视频| 日韩毛片一区视频免费| 国产亚洲精品国产| 日韩版码免费福利视频| 国产亚洲美女精品久久| 亚洲成AV人片一区二区| 亚洲视频免费观看| 国产大陆亚洲精品国产| 久久亚洲高清观看| 永久免费毛片在线播放| 日韩精品视频在线观看免费| 亚洲精品国产成人99久久| 免费看片A级毛片免费看| 国产精品内射视频免费| 亚洲成a人片毛片在线| 国产一区二区三区免费看| 久久免费高清视频| 亚洲欧洲无卡二区视頻| 亚洲片一区二区三区| 国产精品免费观看| 91成人免费观看在线观看| 亚洲av永久无码嘿嘿嘿| 国产亚洲人成A在线V网站| 成人女人A级毛片免费软件|