共计 1242 个字符,预计需要花费 4 分钟才能阅读完成。
1. 需要
当初前端都是 SPA,咱们什么时候须要勾销 HTTP 申请呢?
- 当咱们从一个页面跳转到另外一个页面时,如果前一个页面的申请还没有返回,那么咱们心愿勾销前一个页面的申请
- 某些操作耗时比拟长(不能是保留等操作哦),如果用户不想期待呢,勾销了操作,对应咱们也须要勾销 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. 总结
fetch
与AbortController
集成:咱们将signal
属性作为可选参数(option)进行传递,之后 fetch 会监听它,因而它可能停止 fetch.- AbortController 是可伸缩的,能够用于
一次性终止多个申请
; - 参考 fetch 的实现,咱们本人的代码也欠缺一下,实现基于 AbortController 操作勾销操作;
- axios 默认反对 Abort 操作;
正文完
发表至: javascript
2021-04-25