javascript `AbortController`

AbortController 浏览器内置的api,常用于控制被取消的异步操作。
常见用途时取消fetch() 请求, Streams、 Websocket

她包含两个主要部分:

  • controller 对象: 用来创建和触发 取消操作
  • signal 对象: 传递给目标api,让她知道何时需要终止。

基本用法

	const controller = new AbortController()
	const signal = controller.signal;
 // zai. fetch() zhong 使用
	fetch(`https://....`, { signal })
	.then(res => res.json())
	.then(data => console.log(data))
	.catch(err=>{
		if(err.name === "AbortError"){
			   console.log('请求已被取消');
		}else {
				console.error('请求出错:', err);
		}
		
  })


  // x 秒后取消请求
	setTimeOut(()=>{
	 controller.abort()
},x)

fetch 开始请求

x 秒后调用 controller.abort()

fetch 会抛出一个 AbortError,我们在 .catch() 中捕获

属性/方法说明
new AbortController()创建一个控制器实例
.signal读属性,返回一个 AbortSignal 对象
.abort(reason?)触发取消操作,可以传入自定义原因
AbortSignal.aborted布尔值,表示是否已被中止
AbortSignal.reason获取传给 abort() 的原因
AbortSignal.addEventListener("abort", handler)监听中止事件

多个任务可以共享 取消信号

	 const controller = new AbortController()
	 const options = { signal: controller.signal }

	Promise.all([
		fetch("https://...", options),
		fetch("https://...", options),
	]).catch((err)=>{
		if(err.name === "AbortError"){
			 console.log('所有请求被取消');
		}
	})
	// 只要调用一次,所有请求都会取消
	controller.abort();

自定义异步任务

自定义任务取消

  function doSomeTasks(signal) {
  	return  new Promise((resolve,reject)=>{
			const timer = setTimeOut(()=>{ resolve('任务完成了。。。') },5000)
			signal.addEventListener('abort', ()=> {
				clearTimeout(timer)
				reject(new Error('任务被取消了。。。。'))
			})
		})
  }
	const  controller = new AbortController()
	doSomeTasks(controller.signal).catch(err => console.log(err.message))

	// 1s 后取消
	setTimeOut(()=>{ 
	 controller.abort();
 },1000)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网开三面

你的鼓励将是我创造的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值