如何中断Promise的链式调用?
Posted c.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何中断Promise的链式调用?相关的知识,希望对你有一定的参考价值。
文章目录
如何中断Promise的链式调用?
问题:当promise状态改变时,他的链式调用都会生效,那如果我们有这个一个实际需求:我们有5个then(),但其中有条件判断,如当我符合或者不符合第三个then条件时,要直接中断链式调用,不再走下面的then,该如何操作?
我们知道Promise有三种状态:pending(进行中)
、fulfilled(已成功
)和rejected(已失败)
,当状态从pending(进行中)
变成fulfilled(已成功
)或者rejected(已失败)
的时候就会调用Promise的then
方法, 如果一直在pending(进行中)
状态的话,就不会执行到then
方法了。
那我们就可以利用这一点去中断Promise的链式调用了,在回调函数中返回一个 pending(进行中)
状态的Promise 对象,这样后面的then
方法就不会执行了。
这里的原理是利用了promise.then()
返回的新 promise 的结果状态是由 then()
指定的回调函数执行的结果决定。也就是说:
- 如果抛出异常, 新 promise 变为
rejected
, reason 为抛出的异常 - 如果返回的是非 promise 的任意值, 新 promise 变为
resolved
, value 为返回的值 - 如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果
所以我们在promise.then()
返回了一个pending(进行中)
状态的Promise 对象,promise.then()
返回的新 promise 的结果状态就一直是pending(进行中)
的,后面的then
方法也不会执行了。
let p = new Promise((resolve, reject) => setTimeout(() => resolve('OK');, 1000););
p.then(value => return new Promise(() => );)
.then(value => console.log(222);)
.then(value => console.log(333);)
.catch(reason => console.warn(reason););
但这种方式网上有的博主说有可能会造成潜在的内存泄露,并提供了一些解决思路,可以参考:从如何停掉 Promise 链说起
但当然有一些反对者经过实验证明,并不会有内存泄漏的问题,这里附上文章链接:永不 resolve / reject 的 Promise 会导致内存泄漏吗?
以上是关于如何中断Promise的链式调用?的主要内容,如果未能解决你的问题,请参考以下文章
深入理解 promise:promise的三种状态与链式调用
Vue- Promise函数---参数resolve(调用.then方法)-- 参数reject(调用.catch方法)---链式结构