摘要:業務場景在不少業務場景下,我們需要實現簡單的請求緩存即某個請求只發起一次請求,例如上傳的獲取獲取配置的接口等。這些接口可以通過實現簡單的緩存并能夠控制更新,而不需要另外引入緩存層。上面是一個簡單的緩存上傳的例子,并且會在上傳失敗時刷新。
業務場景
在不少業務場景下,我們需要實現簡單的請求緩存(即某個請求只發起一次請求),例如上傳 Token 的獲取、獲取配置的接口等。
這些接口可以通過 Promise 實現簡單的緩存并能夠控制更新,而不需要另外引入緩存層。
示范代碼用七牛上傳作例子,一般我們會把七牛上傳封裝為一個多帶帶的 Upload 組件,外部只需要調用組件,而 token 的獲取封裝到組件內部實現。
//Upload.vue let fetchToken = null; export default { data() { return { token: "" }; }, methods: { async upload() { try { // ... } catch(err) { alert(err.message); this.refreshToken(); } }, refreshToken() { fetchToken = null; this.fetchToken(); }, fetchToken() { if (!fetchToken) { fetchToken = request.get("/api/qiniu/token"); } try { this.token = await fetchToken; } catch(err) { console.error(err); } } }, created() { this.fetchToken(); } };
上面是一個簡單的緩存上傳 token 的例子,并且會在上傳失敗時刷新 token。
與直接緩存 Token 的值比較,緩存請求有什么好處?// 緩存值的代碼 export default { methods: { fetchToken() { if (!fetchToken) { fetchToken = await request.get("/api/qiniu/token"); } try { this.token = fetchToken; } catch(err) { console.error(err); } } } }
一個比較常見的 Upload 組件 的應用場景,在一個頁面里同時使用多次該組件。
就上面的代碼例子,如果使用緩存值的方法,那么頁面一打開就會請求兩次獲取 Token 接口。
繼續完善 Upload 組件//Upload.vue let fetchToken = null; export default { methods: { async upload() { try { this.fetchToken(); const token = await fetchToken; // ... } catch (err) { alert(err.message); this.refreshToken(); } }, refreshToken() { fetchToken = null; this.fetchToken(); }, fetchToken() { if (!fetchToken) { fetchToken = request.get("/api/qiniu/token"); } } }, created() { this.fetchToken(); } };
為了防止多個 Upload 組件 token 不同步問題,不再通過this.token保存 token,而是每次都等待 fetchToken resolved,保證獲取到的 token 一定是最新的。
當然,這里還有很多需要優化,例如失敗后的重試、判斷是 401 失敗才刷新 token、設置錯誤時間、定時刷新等等,但總體思路就是上面代碼所展示的內容。
另外再介紹一個經典應用場景const fetchConfig = (() => { let configRequest = null; return () => { if (!configRequest) { configRequest = Promise.all([services.customer.config1, services.customer.config2]) .then(([data1, data2]) => { return { data1, data2 }; }) .catch(err => { configRequest = null; return Promise.reject(err); }); } return configRequest; }; })(); export default { async beforeRouteEnter(to, from, next) { try { // 配置信息僅需要成功請求一次 const [data, config] = await Promise.all([services.customer.getInfo(), fetchConfig()]); next(vm => { vm.data = data; vm.config = config; vm.init(); }; } catch (err) { next(err); } } };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99232.html
摘要:前言在中大型的前端應用里面項目里面通常包夾了大量的請求,通常情況這些請求夾雜在業務代碼里面拓展維護的成本比較大。測試代碼及源碼下載在中歸納本篇文章是通過對請求調用前,調用后的統一處理來更有效的控制這些請求類似于面向切面的思想。 前言 在中大型的前端應用里面項目里面通常包夾了大量的ajax請求,通常情況這些請求夾雜在業務代碼里面,拓展維護的成本比較大。 如要改整個項目的url前綴(后端把...
摘要:換句話說,我們很好的對代碼的功能關注點進行了分離通過將使用消費值得地方函數中的邏輯和通過異步流程來獲取值迭代器的方法進行了有效的分離。但是現在我們通過來管理代碼的異步流程部分,我們解決了回調函數所帶來的反轉控制等問題。 本文翻譯自 Going Async With ES6 Generators 由于個人能力知識有限,翻譯過程中難免有紕漏和錯誤,還望指正Issue ES6 Gener...
摘要:更好的異步編程上面的方法可以適用于那些比較簡單的異步工作流程。小結的組合目前是最強大,也是最優雅的異步流程管理編程方式。 訪問原文地址 generators主要作用就是提供了一種,單線程的,很像同步方法的編程風格,方便你把異步實現的那些細節藏在別處。這讓我們可以用一種很自然的方式書寫我們代碼中的流程和狀態邏輯,不再需要去遵循那些奇怪的異步編程風格。 換句話說,通過將我們generato...
摘要:導讀全稱即異步與它最早在中被使用然后由推廣開來典型的代表應用有以及現代網頁中幾乎無不歡前后端分離也正是建立在異步通信的基礎之上瀏覽器為做了什么現代瀏覽器中雖然幾乎全部支持但它們的技術方案卻分為兩種標準瀏覽器通過對象實現了的功能只需要通過一行 導讀 Ajax 全稱 Asynchronous JavaScript and XML, 即異步JS與XML. 它最早在IE5中被使用, 然后由Mo...
答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網發布的真實大廠前端面經題目,我一直在收集題目長期一個一個的記錄下來的,可能會有重復,但基本前端的面試大綱和需要掌握的知識都在其中了,面試題僅做學習參考,學習者閱后也要用心鉆研其中的原理,重要知識需要系統學習、透徹學習,形成自己的知識鏈。 二、532道前端真實大廠面試題 express和koa的對比,兩者中間件的原理,koa捕獲異常多種情...
閱讀 964·2023-04-26 02:56
閱讀 9438·2021-11-23 09:51
閱讀 1850·2021-09-26 10:14
閱讀 2980·2019-08-29 13:09
閱讀 2154·2019-08-26 13:29
閱讀 571·2019-08-26 12:02
閱讀 3562·2019-08-26 10:42
閱讀 3000·2019-08-23 18:18