如何中断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()指定的回调函数执行的结果决定。也就是说:

  1. 如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常
  2. 如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值
  3. 如果返回的是另一个新 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 会导致内存泄漏吗?

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值