完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在使用 fetch 和 promise 的时候,中途终止它们是一个很常见的需求,我们来看一看怎么实现。通过本文您可以学到:
我们先来回顾一下怎么在外部终止 xhr 请求: let xhr = new XMLHttpRequest();xhr.onload = (res) => console.log(res);xhr.onerror = (err) => console.log(err);xhr.onabort = () => console.log('aborted!');xhr.open('get', 'https://slowmo.glitch.me/5000');xhr.send();setTimeout(() => { xhr.abort();}, 200);AbortController 参考资料:abortController接口 AbortController 接口表示一个控制器对象,允许你根据需要中止一个或多个 Web 请求。目前这个接口的兼容性是除了IE已经能够兼容所有主流浏览器了。示例如下: const controller = new AbortController();const signal = controller.signal;signal.addEventListener('abort', () => { console.log('aborted!');});controller.abort();中止 fetch 请求 fetch 方法的第二个参数可以接收 signal 参数,当被中止时,会 reject 一个名字为 AbortError 的 error 并被 catch 捕捉到,示例如下: const controller = new AbortController();const signal = controller.signal;fetch('https://slowmo.glitch.me/5000', { signal }) .then(res => res.json()) .then(res => console.log(res)) .catch((err) => { if (err.name === 'AbortError') { console.log('aborted'); } else { console.log('error'); } });setTimeout(() => { controller.abort();}, 200);中止 promise 其实不需要 AbortController也可以实现手动中止 promise,还是用那套劫持的方法。示例如下: class MyPromise { constructor(executor) { let abort = null; let p = new Promise((resovle, reject)=>{ executor(resovle, reject); abort = err => reject(err); }) p.abort = abort; return p; }}// testlet test = new MyPromise((resolve) => { setTimeout(() => resolve(1), 200);});// 这里不能直接把 then 和 catch 加到上面的末尾去test.then(res => console.log(res)).catch(err => console.log(err));test.abort('aborted!');上面有一些不完美,就是在初始化 test 的时候,后面不能带上 then 或 catch 方法,因为这些方法返回的是一个 Promise 实例而不是 MyPromise 实例。 使用 AbortController 可以解决这个问题,示例如下: class MyPromise { constructor(executor, { signal }) { return new Promise((resolve, reject)=>{ executor(resolve, reject); if (signal) { signal.addEventListener('abort', () => { reject('aborted!'); }); } }) }}// testconst controller = new AbortController();const signal = controller.signal;let test = new MyPromise((resolve) => { setTimeout(() => resolve(1), 200);}, { signal }).then(res => console.log(res)).catch(err => console.log(err));controller.abort('aborted!');上面两种方案看起来很美好,但是其实并不完美,因为 then 和 catch 方法返回的是一个 Promise 实例而不是 MyPromise 实例,所以目前这个 abort 方法不能中断 then 或 catch 里面的内容,如果要修正的话,需要再继续改写 then 和 catch 方法。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
“0元购”智元灵犀X1机器人,软硬件全套图纸和代码全公开!资料免费下载!
1122 浏览 1 评论
1030 浏览 0 评论
【实操文档】在智能硬件的大模型语音交互流程中接入RAG知识库
5882 浏览 1 评论
防止AI大模型被黑客病毒入侵控制(原创)聆思大模型AI开发套件评测4
1002 浏览 0 评论
不可错过!人工神经网络算法、PID算法、Python人工智能学习等资料包分享(附源代码)
3296 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 04:32 , Processed in 0.385867 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号