链式调用就是promise的优点吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链式调用就是promise的优点吗?相关的知识,希望对你有一定的参考价值。
参考技术A 优点:让回调函数变成了规范的链式写法,程序流程可以看的很清楚。他有一整套接口,可以实现许多强大的功能,比如同时执行多个异步操作,等到他们的状态都改变以后,在执行一个回调函数;再比如,为多个回调函数中抛出的错误,统一制定处理方法…
有一个传统写法没有的好处:他的状态一旦改变,无论何时查询,都能得到这个状态。这意味着无论何时为peomise实例添加回调函数,该函数都能正确执行。
传统写法的话都通过监听事件来执行回调函数,一旦错过了事件,再添加回调函数是不会执行的。
缺点:
编写的难度比传统写法高,而且阅读代码也不是一眼可以看懂。你只会看到一堆then,必须自己在then的回调函数里面理清逻辑。
promise两个缺点,一个是一旦开始执行就无法取消,第二个就是无法进度追踪
如何中断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的优点吗?的主要内容,如果未能解决你的问题,请参考以下文章
jQuery的链式调用原理,Promise的链式调用,this的问题