运行代码后可以在控制台看到如下结果:
【如何优雅地中断 Promise?】如果我们需要同时对多个请求进行终止操作的的话,使用上面这种方式非常简单方便 。
如果我们想自定义终止请求的原因的话,可以直接在 方法里传递我们想要的原因,这个参数可以是任何 类型的值 。传递的终止的原因会被 接收到,然后放在它的 属性中 。这个我们下面会讲到 。
的相关属性和方法
文章插图
详细介绍 AbortSignal
AbortSignal 的属性和方法
接口继承自 EventTarget ,所以 对应的属性和方法,都继承下来了 。当然还有一些自己特有的方法和属性,我们下面会一一讲解到的 。需要注意的是,部分属性有兼容性问题,具体的兼容性大家可以参考这里 AbortSignal#browser_compatibility。
静态方法 abort 和 timeout
这两个方法是 类上的静态方法,用来创造 实例 。其中 用来创造一个已经被终止的信号对象 。我们来看下面的例子:
运行代码,控制台的输出结果如下:
文章插图
对应的请求甚至都没有发送出去
我们也可以给 方法传递终止的原因,比如是一个对象:
那么输出的结果就如下图所示:
的 属性就变成了我们自定义的值 。
同样的,大家看到 应该很容易想到是创造一个多少毫秒后会被终止的 对象 。代码如下:
代码的运行结果如下:
文章插图
可以看到我们打印了两次 ,第一次是立即打印的,第二次是等到请求被终止后打印的 。可以看到第一打印的时候,的状态还是没有被终止的状态 。当请求被终止后,第二次打印的结果表明 这个时候已经被终止了,并且 属性的值表明了这次请求被终止是因为超时的原因 。
属性 aborted 和 reason
实例有两个属性;一个是 表示当前信号对象的状态是否是终止的状态,是起始状态,表示信号没有被终止,表示信号对象已经被终止了 。
属性可以是任何的 类型的值,如果我们在调用 方法的时候没有传递终止信号的原因,那么就会使用默认的原因 。
默认的原因有两种,一种是通过 方法终止信号对象,并且没有传递终止的原因,那么这个时候 的默认值就是:;如果是通过 方法终止信号对象,那么这个时候的默认原因就是: 。如果我们主动传递了终止的原因,那么对应的 的值就是我们传递进去的值 。
实例方法 throwIfAborted
这个方法通过名称大家也能猜出来是什么作用,那就是当调用 的时候,如果这个时候 对象的状态是终止的,那么就会抛出一个异常,异常的值就是对应 的 值 。可以看下面的代码例子:
运行后在控制台的输出如下:
可以看到直接抛出异常,这个时候我们可以通过 进行捕获,然后再进行对应的逻辑处理 。这个方法也是很有帮助的,我们在后面会讲到 。当我们实现一个自定义的可以主动取消的 的时候这个方法就很有用 。
事件监听 abort
对于 对象来说,它还可以监听 事件,然后我们就可以在 被终止的时候做一些额外的操作 。下面是事件监听的简单例子:
运行后在控制台的输出如下:
文章插图
可以看到在 被终止的时候,我们之前添加的事件监听函数就开始运行了 。其中 表示的是接收到的事件对象,然后这个事件对象上的 和 表示的就是对应的 对象 。
实现一个可以主动取消的 Promise
当我们对 以及 比较熟悉的时候,我们就可以很方便的构造出我们自定义的可以取消的 了 。下面就是一个比较简单的版本,大家可以看一下:
这次的代码稍微多了一点,不过相信大家还是很容易就知道上面的代码要表示的是什么意思 。
首先我们自定义了 这个函数,然后函数接收一个非必传的 对象;然后立即返回一个新构建的 ,这个 的内部我们添加了一些额外的处理 。首先我们判断了 是否存在,如果存在就调用它的 方法 。因为有可能这个时候 的状态已经是终止的状态了,需要立即将 的状态变更为 状态 。
如果此时 的状态还没有改变,那么我们可以给这个 添加一个事件监听,一旦 的状态改变,我们就需要立即去改变 的状态 。
当我们下面的 的时间设置为100毫秒的时候,上面的 总是拒绝的状态,所以会看到控制台的打印结果如下:
推荐阅读
- 命令行http调试利器curl如何使用?
- 水凝膜怎么撕下来教程视频……如何取下手机水凝膜
- 峡组词 峡字如何组词 匣的拼音和组词
- 烧烤摊上如何烤茄子
- 天猫网站网络营销方式~如何做好视频营销?
- 淡奶油打成豆腐渣如何补救
- 三伏天种香菜,做法简单种出来的香菜还好吃,如何做呢 香菜简笔画可爱
- 葛优|海南岛电影节群星争艳,赵雅芝葛优大咖降临,宋茜倪虹洁状态满分
- 小米手环5 如何使用 小米手环5使用说明书
- 视频驱动软件下载 如何安装视频驱动?