国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 20:43:49
文檔

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

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

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

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

function divide(operand1, operand2)

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

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

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

function calculate(operand1, operand2, operator)

這個calculate函數根據operator參數來調用內部的plus, subtract, multiply, divide函數。然而,因為divide函數變成了異步函數,所以整個calculate函數不得不也轉變為異步函數:

function calculate(operand1, operand2, operator, callback)

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

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

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

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

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

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

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

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

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

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

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

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

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

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 一区二区三区电影 | 久久精品成人一区二区三区 | 国产69精品久久久久777 | 亚洲视频欧洲视频 | 91久久精品一区二区三区 | 国产精品欧美亚洲韩国日本不卡 | 免费国产va在线观看视频 | 日韩国产欧美视频 | 97一级毛片全部免费播放 | 久久亚洲精品国产精品婷婷 | 天天做天天爱夜夜爽毛片毛片 | 免费观看a毛片一区二区不卡 | 欧美日韩激情 | 一区不卡在线观看 | 欧美试看 | 亚洲一区二区三区中文字幕 | 拍拍拍免费网站 | 91精品推荐 | 91精品成人免费国产 | 色女人在线 | 亚洲一区二区三区精品影院 | 久久91这里精品国产2020 | 日韩欧美中字 | 日韩系列第一页 | 欧美性猛交一区二区三区精品 | 欧美另类色图 | 欧美日韩国产码高清综合人成 | 亚洲国产一成人久久精品 | 国产免费资源高清小视频在线观看 | 欧美日韩精品在线播放 | 全黄网站| 久久成人国产精品一区二区 | 精品国产一区二区三区久久影院 | 欧美一区二区三区在线 | 久久精品2 | 国产亚洲视频在线观看 | 欧美精品午夜久久久伊人 | 精品91精品91精品国产片 | 五月婷婷丁香 | 欧美影院在线 | 欧美国产成人精品一区二区三区 |