面试官问为什么要返回一个新的promise
为了链式调用?
为了简化异步模型吧。Promise
有以下 3 种状态:
补一张状态转移图,大概是这个样子:
pending 状态的 Promise
对象可能会变为 fulfilled 状态,也可能变为失败状态 rejected。当其中任一种情况出现时,Promise 对象的 then
方法会被调用。
如果 then
方法不返回 Promise
可以吗?当然可以。我们可以这么写:
const p = Promise .....
p.then(...)
p.then(...)
p.catch(...)
p.....
then
可以没有返回值,但是写法上就不够优雅。如果 then
方法返回一个 Promise
对象,我们就可以换一种写法,使用链式调用:
const p = Promise .....
.then(...)
.then(...)
.catch(...)
.....
其实,then 每次都返回了新的 Promise,这种链式写法也等价于于:
const p = Promise .....
const p1 = p.then(...)
const p2 = p.then(...)
const p3 = p.catch(...)
const p4 = p.....
关于这个规范的细节,Chrome/Nodejs/V8 还出现过 bug。
更多阅读:
返回一个新的Promise更加FP
试想,如果不返回一个新Promise,而是全部对第一次的Promise执行then,这个then方法就是个副作用方法,你想要搞清楚一个Promise最终的执行结果必须看清楚这个Promise所有then执行的地方,非常恶心,不利于维护
而返回一个新的Promise,我只需要关注then执行的地方就行了
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
3 回答1.3k 阅读✓ 已解决
因为
promise
的状态修改只能pending -> resolved
这个方向,一旦修改,不可更改。所以,如果不返回一个新的
promise
,状态怎么表示呢?