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

  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 会导致内存泄漏吗?

以上是关于如何中断Promise的链式调用?的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 promise:promise的三种状态与链式调用

ES6 Promise对象then方法链式调用

链式调用就是promise的优点吗?

Vue- Promise函数---参数resolve(调用.then方法)-- 参数reject(调用.catch方法)---链式结构

promise和链式调用

Promise的链式调用三种写法,Promise.all与式调用