文章目录
如何中断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的链式调用,通过返回一个pending状态的Promise来阻止后续then方法的执行。同时,文章提及了网上的观点,一部分博主认为这可能导致内存泄漏,而另一部分实验证明并无此问题。最后,文章提供了相关资源供读者进一步了解。
766

被折叠的 条评论
为什么被折叠?



