关于前端:前端进阶2使用fetchaxios时-如何取消http请求

9次阅读

共计 1242 个字符,预计需要花费 4 分钟才能阅读完成。

1. 需要

当初前端都是 SPA,咱们什么时候须要勾销 HTTP 申请呢?

  1. 当咱们从一个页面跳转到另外一个页面时,如果前一个页面的申请还没有返回,那么咱们心愿勾销前一个页面的申请
  2. 某些操作耗时比拟长(不能是保留等操作哦),如果用户不想期待呢,勾销了操作,对应咱们也须要勾销 HTTP 申请

对于原生的 XMLHttpRequest, 是反对勾销 http 申请(abort) 操作的: XMLHttpRequest.abort()
那么,当咱们应用 ES6 的 fetch,或者应用 axios 库,如何实现呢?

2. Fetch 勾销 http 申请

fetch 与 XMLHttpRequest(XHR)相似,是 ES6 之后浏览器(除 IE 之外)默认反对的 http 操作函数。惋惜不是默认反对 abort 操作。但咱们能够通过 AbortController 来实现,间接上代码:

// 申明 AbortController
const controller = new AbortController();

// 失常的 http 调用
fetch('https://jackniu81.github.io', { signal: controller.signal})
    .then(r => r.json())
    .then(response => {console.log(response);
    })
    .catch(err => {if (err.name === 'AbortError') {console.log('Fetch was aborted')
        } else {console.log('Error', err)
        }
    });// 须要勾销申请时,调用:controller.abort()

3. axios 勾销 http 申请

axios 曾经实现了 abort 操作,

var source = axios.CancelToken.source();

axios.get('https://jackniu81.github.io', {cancelToken: source.token}).catch(function(err) {if (axios.isCancel(err)) {
    // handle our cancel operation
    console.log('Request canceled', err.message);
  } else {// handle real error here}
});

// 须要勾销申请时,调用:source.cancel('Abort Request');

4. jquery 勾销 http 申请

$.ajax 外部曾经实现了 abort 性能。间接调用 .abort() 即可。

5. 总结

  1. fetchAbortController 集成:咱们将 signal 属性作为可选参数(option)进行传递,之后 fetch 会监听它,因而它可能停止 fetch.
  2. AbortController 是可伸缩的,能够用于 一次性终止多个申请
  3. 参考 fetch 的实现,咱们本人的代码也欠缺一下,实现基于 AbortController 操作勾销操作;
  4. axios 默认反对 Abort 操作;
正文完
 0