promise的then为什么要返回一个新的promise

面试官问为什么要返回一个新的promise

阅读 6.3k
3 个回答

因为promise的状态修改只能pending -> resolved这个方向,一旦修改,不可更改。
所以,如果不返回一个新的promise,状态怎么表示呢?

为了链式调用?

为了简化异步模型吧。Promise 有以下 3 种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失败。

补一张状态转移图,大概是这个样子:

promises.png

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执行的地方就行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题