国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > AJAX > 正文

js使用Promise實現簡單的Ajax緩存

2024-09-01 08:33:59
字體:
來源:轉載
供稿:網友

業務場景

在不少業務場景下,我們需要實現簡單的請求緩存(即某個請求只發起一次請求),例如上傳 Token 的獲取、獲取配置的接口等。

這些接口可以通過 Promise 實現簡單的緩存并能夠控制更新,而不需要另外引入緩存層。

示范代碼

用七牛上傳作例子,一般我們會把七牛上傳封裝為一個單獨的 Upload 組件,外部只需要調用組件,而 token 的獲取封裝到組件內部實現。

//Upload.vuelet 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 組件 的應用場景,在一個頁面里同時使用多次該組件。

<template> <div class="upload1"><upload /></div> <div class="upload2"><upload /></div></template>

就上面的代碼例子,如果使用緩存值的方法,那么頁面一打開就會請求兩次獲取 Token 接口。

繼續完善 Upload 組件

//Upload.vuelet 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);  } }};

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 光山县| 清远市| 濉溪县| 枞阳县| 青神县| 罗定市| 新巴尔虎左旗| 汾西县| 龙井市| 新化县| 青铜峡市| 桃园县| 新平| 望都县| 鞍山市| 铁岭市| 巫溪县| 安龙县| 龙游县| 通道| 耒阳市| 濮阳市| 嘉定区| 琼结县| 金乡县| 彝良县| 德惠市| 沛县| 宁安市| 新乡市| 任丘市| 黄陵县| 偏关县| 克东县| 东丰县| 宜都市| 会泽县| 二连浩特市| 苏州市| 淮阳县| 石门县|