如何阻断 Promise 的下一步执行

我们知道一个 promise 对象, 可以不断的 .then(...).then(...) 的往下执行, 但如果希望在其中一个 .then(...) 中的某些条件下, 不再触发下面的 .then(...) 呢?

你可能会想到可以 throw 一个错误呀, 或者 return 一个 Promise.reject(...), 就会进入后面最近的一个 .catch(...) 而不是 .then(...).

如果希望不再触发下面的 .then(...) 以及 .catch(...) 呢?

其实, 就是要求一种 Promise 对象, 它既不会 resolve 也不会 reject, 那就很简单了, 可以这样

.then(() => new Promise(() => {})).then(() => { /** 这里就不会再执行了 */ }).catch(() => { /** 这里就不会再执行了 */ });
1

同样, 也适用于

.catch(() => new Promise(() => {})).then(() => { /** 这里就不会再执行了 */ }).catch(() => { /** 这里就不会再执行了 */ });
1

应用

什么情况会用到呢?

我们在使用 ajax 请求数据的时候, 经常会遇到网络错误等比较通用的错误, 而 catch 到错误并处理后, 却又不得不继续往后抛出, 这样越往后的 catch 中拿到的错误其类型可能性越多. 后面的 catch 处理错误时, 就必须判断错误类型, 造成代码臃肿.

我们公司在特定的系统场景下, 错误类型比较单一, 希望可以把一些常见的错误在统一封装的网络请求库中直接执行指定的行为, 如 Toast 提醒等, 后面的 catch 捕获到的就不需要再关心这个错误了. 当然后面的 then 也不需要再执行.