• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    js使用Promise實現(xiàn)簡單的Ajax緩存

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:03:48
    文檔

    js使用Promise實現(xiàn)簡單的Ajax緩存

    js使用Promise實現(xiàn)簡單的Ajax緩存:業(yè)務(wù)場景 在不少業(yè)務(wù)場景下,我們需要實現(xiàn)簡單的請求緩存(即某個請求只發(fā)起一次請求),例如上傳 Token 的獲取、獲取配置的接口等。 這些接口可以通過 Promise 實現(xiàn)簡單的緩存并能夠控制更新,而不需要另外引入緩存層。 示范代碼 用七牛上傳作例子,一般我們
    推薦度:
    導(dǎo)讀js使用Promise實現(xiàn)簡單的Ajax緩存:業(yè)務(wù)場景 在不少業(yè)務(wù)場景下,我們需要實現(xiàn)簡單的請求緩存(即某個請求只發(fā)起一次請求),例如上傳 Token 的獲取、獲取配置的接口等。 這些接口可以通過 Promise 實現(xiàn)簡單的緩存并能夠控制更新,而不需要另外引入緩存層。 示范代碼 用七牛上傳作例子,一般我們

    業(yè)務(wù)場景

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

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

    示范代碼

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

    //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 組件 的應(yīng)用場景,在一個頁面里同時使用多次該組件。

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

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

    繼續(xù)完善 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 一定是最新的。

    當然,這里還有很多需要優(yōu)化,例如失敗后的重試、判斷是 401 失敗才刷新 token、設(shè)置錯誤時間、定時刷新等等,但總體思路就是上面代碼所展示的內(nèi)容。

    另外再介紹一個經(jīng)典應(yīng)用場景

    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);
     }
     }
    };
    

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

    文檔

    js使用Promise實現(xiàn)簡單的Ajax緩存

    js使用Promise實現(xiàn)簡單的Ajax緩存:業(yè)務(wù)場景 在不少業(yè)務(wù)場景下,我們需要實現(xiàn)簡單的請求緩存(即某個請求只發(fā)起一次請求),例如上傳 Token 的獲取、獲取配置的接口等。 這些接口可以通過 Promise 實現(xiàn)簡單的緩存并能夠控制更新,而不需要另外引入緩存層。 示范代碼 用七牛上傳作例子,一般我們
    推薦度:
    標簽: 使用 緩存 js
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品亚韩精品无码a在线| 欧美成人精品一区二区三区| 国产精品中文字幕在线观看| 亚洲精品无码av天堂| 国产精品一级片| 在线涩涩免费观看国产精品| 国产精品成人国产乱一区| 99国产精品永久免费视频| 午夜精品乱人伦小说区| 鲸鱼传媒绿头鱼实验室之炮机测评日韩精品一级毛 | 中文字幕精品无码一区二区三区| AAA级久久久精品无码区| 国产夫妇精品自在线| 久久精品人人槡人妻人人玩AV| 亚洲午夜精品久久久久久app| 久久久久国产精品嫩草影院| 国产精品久久久99| 四虎精品影院4hutv四虎| 国产精品国产三级专区第1集| 精品福利视频一区二区三区| 亚洲AV永久青草无码精品| 亚洲国产精品成人| 亚洲A∨午夜成人片精品网站| 免费视频精品一区二区| 久久99精品国产麻豆蜜芽| 国产精品夜色视频一级区| 国产精品高清免费网站| www亚洲欲色成人久久精品| 先锋影音国产精品| 2022国产精品最新在线| 午夜精品美女写真福利| 四虎国产精品免费入口| 亚洲精品在线观看视频| 亚洲无删减国产精品一区| 亚洲国产成人久久精品影视| 2020最新久久久视精品爱| Xx性欧美肥妇精品久久久久久| 国产精品 猎奇 另类视频| 国内精品久久久久影院网站| 精品无码人妻一区二区三区不卡| 精品久久久久久99人妻|