axios中取消請求(使用CancelToken)


axios中取消請求(使用CancelToken)

小文章

在平時的開發過程中,我們會經常遇到菜單切換的問題,在一些切換頻率較低的情況下,在切換到另一個頁面的時候,上一個頁面基本沒有未完成的異步請求,即時有,在一些情況下也是可以忽略的。但是,在一些切換頻率較高的頁面中,如果我們不處理這些未完成的請求,那么這些請求會極大的影響頁面的性能,甚至導致之后的請求超時。

如果需要斷開Javascript的ajax請求,一種是通過設置時間,超時自動斷開,另一種我們可以調用XMLHttpRequest對象上的abort方法。

在使用Vue的過程中,大多是使用axios來發起http請求,那么在axios中我們要怎么中止某個http請求呢?遍尋網上教程無果后,想起了革命先輩的名言–自己動手,豐衣足食。好了,我要秀英語水平了,那么我們只好自己看英文文檔了。打開axios的github主頁,果然文檔才是我們的好幫手,很快就找到解決問題的辦法。

You can cancel a request using a cancel token.
The axios cancel token API is based on the withdrawn cancelable promises proposal.
You can create a cancel token using the CancelToken.source factory as shown below:

var CancelToken = axios.CancelToken;
var source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');

查找axios的文檔,發現可以通過使用CancelToken來取消axios發起的請求,我們可以自己寫一段代碼來驗證。

var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Axios!',
    source: null
  },
  methods: {
    sendRequest() {
      this.source = this.axios.CancelToken.source(); // 這里初始化source對象
      this.axios.get(url, {
        cancelToken: this.source.token // 這里聲明的cancelToken其實相當於是一個標記,
                                       // 當我們要取消請求的時候,可以通過這個找到該請求
      })
      .then(res => {
        // 你的邏輯
      })
      .catch(res => {
        // 如果調用了cancel方法,那么這里的res就是cancel傳入的信息
        // 你的邏輯
      })
    },
    cancel() {
      this.source.cancel('這里你可以輸出一些信息,可以在catch中拿到')
    }
  }
})

實際使用參考

this.$http
  .post(
    ...TaobaoService.purchaseOrderExport(this.searchForm, this.sortField).concat({
      cancelToken: new this.$http.CancelToken(function (cancel) {
        // userDeleteCancel = cancel
      })
    })
  )
  .then(response => {
    this.selectedArr = []
    this.queryData()
    this.$Message.success('已加入任務列表')
  })
  .catch(thrown => {
  })


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM