最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

axios取消請求CancelToken的用法示例代碼

 更新時間:2023年10月10日 08:57:51   作者:康師傅不會煮面  
Axios提供了取消請求的功能,可以通過使用CancelToken來實現(xiàn),這篇文章主要給大家介紹了關(guān)于axios取消請求CancelToken的用法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

axios中取消請求情況分為1:取消該請求之后的相同請求;2:取消該請求之前的相同請求

取消該請求之后的相同請求:

在使用 axios 發(fā)送請求時,如果在短時間內(nèi)連續(xù)發(fā)送同一個請求,可能會出現(xiàn)請求結(jié)果混亂或重復(fù)響應(yīng)的問題。為了避免這種情況,我們可以使用 axios 的取消請求功能,每次發(fā)送請求前先取消之前的請求。下面是使用 axios 取消請求的示例代碼:

import axios from 'axios';
 // 創(chuàng)建一個 CancelToken 對象
const source = axios.CancelToken.source();
 // 發(fā)送請求
axios.get('/api/data', {
  // 將 cancelToken 屬性設(shè)置為上面創(chuàng)建的 CancelToken 實例
  cancelToken: source.token
}).then(response => {
  console.log(response.data);
}).catch(error => {
  console.error(error);
});
 // 取消之前的請求
source.cancel('Duplicate request');

在上面的代碼中,我們先創(chuàng)建一個 CancelToken 對象 source ,并將其傳遞給發(fā)送請求的 cancelToken 屬性中。然后在需要取消之前請求的時候,調(diào)用 source.cancel() 方法即可。此時,后續(xù)的請求將不會被發(fā)送,以避免重復(fù)響應(yīng)。

需要注意的是,如果在請求被取消之前,請求已經(jīng)被發(fā)送并成功響應(yīng),那么該已經(jīng)成功響應(yīng)的請求結(jié)果無法被取消,因此也需要對已經(jīng)成功響應(yīng)的請求結(jié)果做好處理。另外,也需要處理請求被取消的異常情況,以避免出現(xiàn)錯誤。

取消該請求之前的相同請求:

在 axios 中,取消上一次請求與取消前面的所有請求是有差別的。取消上一次請求,我們可以記錄當(dāng)前請求的 cancelToken ,然后在下一次請求之前發(fā)送一個取消請求的操作。而取消前面的所有請求,我們需要維護(hù)一份請求隊列,然后在新的請求發(fā)起之前,將之前的所有請求都取消掉。

下面是一個實現(xiàn)取消前面的所有請求的例子:

import axios from 'axios';
 // 創(chuàng)建一個請求隊列
let pending = [];
const CancelToken = axios.CancelToken;
const removePending = (config) => {
  for (let p in pending) {
    if (pending[p].url === config.url + '&' + config.method) {
      pending[p].cancel("request canceled");
      pending.splice(p, 1);
    }
  }
}
 // 添加請求攔截器
axios.interceptors.request.use(
  (config) => {
    removePending(config);
    config.cancelToken = new CancelToken((c) => {
      pending.push({ cancel: c, url: config.url + '&' + config.method });
    });
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
 // 響應(yīng)攔截器
axios.interceptors.response.use(
  (response) => {
    removePending(response.config);
    return response;
  },
  (error) => {
    return Promise.reject(error);
  }
);

在上面的代碼中,我們創(chuàng)建了一個請求隊列 pending ,然后為請求配置添加了一個 cancelToken ,并將其推入請求隊列中。在發(fā)送新的請求之前,我們遍歷請求隊列,將之前的所有請求都取消掉,并從請求隊列中移除。同時,我們還需要在響應(yīng)攔截器中將已經(jīng)完成的請求從請求隊列中移除。

需要注意的是,如果發(fā)送的請求是無法取消的,例如使用 jsonp 發(fā)送的請求,那么上面的代碼將無法取消這類請求。因此,我們需要根據(jù)實際情況選擇合適的方式來取消請求。

取消之后再次發(fā)送請求提示被cancel怎么辦?

如果在 axios 中取消了一個請求,那么再次發(fā)送同樣的請求會提示 Cancellation 已經(jīng)被取消的錯誤。這是因為 axios 同樣的請求已經(jīng)被 cancel ,因此無法再次發(fā)送。如果需要再次發(fā)送同樣的請求,需要重新創(chuàng)建一個新的 cancelToken ,否則會一直提示被取消。

下面是一個重新創(chuàng)建 cancelToken 的示例代碼:

import axios from 'axios';
let cancelToken = axios.CancelToken;
let cancel;
let config = {
  method: 'get',
  url: '/api/data',
  cancelToken: new cancelToken(function executor(c) {
    // executor 函數(shù)接收一個 cancel 函數(shù)作為參數(shù)
    cancel = c;
  })
};
// 添加請求攔截器
axios.interceptors.request.use(
  (config) => {
    // 如果 cancel 存在說明上次請求被取消了,重新創(chuàng)建一個
    if (typeof cancel === 'function') {
      config.cancelToken = new cancelToken(function executor(c) {
        cancel = c;
      });
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
// 發(fā)送請求
axios(config)
  .then((response) => {
    console.log(response);
  })
  .catch((error) => {
    if (axios.isCancel(error)) {
      console.log('Request canceled', error.message);
    } else {
      console.log(error);
    }
  });
// 取消請求
cancel();

在上面的代碼中,我們在發(fā)送請求前先創(chuàng)建了一個 cancelToken ,并將 cancel 函數(shù)保存下來。當(dāng)發(fā)送請求時,我們檢查 cancel 函數(shù)是否存在,如果存在說明上次請求被取消了,那么我們需要重新創(chuàng)建一個 cancelToken 并將其傳遞給新的請求中。這樣就可以在取消請求后重新發(fā)送同樣的請求了。

由于axios是對XHR對象的封裝,如果請求已經(jīng)被發(fā)送并且服務(wù)器已經(jīng)接收到請求,那么cancelToken 在調(diào)用 abort() 方法取消請求可能會導(dǎo)致一部分?jǐn)?shù)據(jù)已經(jīng)被傳輸。因此,使用 時需要謹(jǐn)慎。

fetch請求才可以做到真正意義上的取消!!!

總結(jié)

到此這篇關(guān)于axios取消請求CancelToken的用法的文章就介紹到這了,更多相關(guān)axios取消請求CancelToken內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue便簽的簡單實現(xiàn)

    Vue便簽的簡單實現(xiàn)

    本文主要介紹了Vue便簽的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • vue3使用el-table實現(xiàn)新舊數(shù)據(jù)對比的代碼詳解

    vue3使用el-table實現(xiàn)新舊數(shù)據(jù)對比的代碼詳解

    這篇文章主要為大家詳細(xì)介紹了在vue3中使用el-table實現(xiàn)新舊數(shù)據(jù)對比,文中的示例代碼講解詳細(xì),具有一定的參考價值,需要的小伙伴可以參考一下
    2023-12-12
  • vue2.0數(shù)據(jù)雙向綁定與表單bootstrap+vue組件

    vue2.0數(shù)據(jù)雙向綁定與表單bootstrap+vue組件

    這篇文章主要介紹了vue2.0數(shù)據(jù)雙向綁定與表單bootstrap+vue組件,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 詳解vue模擬加載更多功能(數(shù)據(jù)追加)

    詳解vue模擬加載更多功能(數(shù)據(jù)追加)

    本篇文章主要介紹了vue模擬加載更多功能(數(shù)據(jù)追加),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue實現(xiàn)樓層跳轉(zhuǎn)效果

    vue實現(xiàn)樓層跳轉(zhuǎn)效果

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)樓層跳轉(zhuǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue2.0 組件傳值通訊的示例代碼

    Vue2.0 組件傳值通訊的示例代碼

    本篇文章主要介紹了Vue2.0 組件傳值通訊的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 利用Vue3的Teleport實現(xiàn)模態(tài)對話框功能

    利用Vue3的Teleport實現(xiàn)模態(tài)對話框功能

    在前端開發(fā)中,模態(tài)對話框是一種常見的用戶交互方式,它能夠有效地提示用戶、收集信息或確認(rèn)操作,隨著現(xiàn)代框架的演進(jìn),Vue 3 的出現(xiàn)為我們提供了更便捷、高效的方式來處理復(fù)雜的界面布局,今天,我們將深入探討如何利用 Vue 3 的新特性 Teleport 來實現(xiàn)模態(tài)對話框
    2025-02-02
  • vue獲取form表單的值示例

    vue獲取form表單的值示例

    今天小編就為大家分享一篇vue獲取form表單的值示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue實現(xiàn)登錄攔截

    vue實現(xiàn)登錄攔截

    這篇文章主要介紹了vue實現(xiàn)登錄攔截,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue打包相關(guān)細(xì)節(jié)整理(小結(jié))

    vue打包相關(guān)細(xì)節(jié)整理(小結(jié))

    這篇文章主要介紹了vue打包相關(guān)細(xì)節(jié)整理(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論

崇仁县| 阜阳市| 上虞市| 津市市| 白银市| 安龙县| 北宁市| 威海市| 兴安盟| 丰顺县| 霸州市| 普宁市| 渭源县| 土默特左旗| 滨海县| 东城区| 定兴县| 涞水县| 平罗县| 贵阳市| 会东县| 白朗县| 虹口区| 绥棱县| 西宁市| 陵川县| 大足县| 章丘市| 昆山市| 垫江县| 将乐县| 巫山县| 永宁县| 柳林县| 兴山县| 墨竹工卡县| 瓮安县| 灵武市| 栾城县| 高淳县| 福鼎市|