为什么在`then`中返回Promise.resolve()导致两个promise创建而不是一个?

时间:2018-04-23 16:35:04

标签: javascript promise

实际上,我不知道如何在真正的Promise超类上检查它,所以我用扩展它的类来测试它。但在我看来,结果会是一样的。

class PromisePlus extends Promise {
  constructor (handler) {
    super(handler)

    console.log('new promise created')
  }
}

new PromisePlus((resolve, reject) => {
  resolve()
}).then(() => {
  return 'GOOD'
}).then(msg => {
  console.log(msg)
})

打印'新承诺'3次

new PromisePlus((resolve, reject) => {
  resolve()
}).then(() => {
  return PromisePlus.resolve('BAD')
}).then(msg => {
  console.log(msg)
})

打印'新承诺'5次。

then处理程序

中返回新Promise的结果相同
new PromisePlus((resolve, reject) => {
  resolve()
}).then(() => {
  return new PromisePlus((resolve, reject) => {
    resolve('BAD')
  })
}).then(msg => {
  console.log(msg)
})

显然,PromisePlus.resolve()会产生新的承诺,但为什么在PromisePlus.resolve()内返回then会导致更多额外的承诺创建?

1 个答案:

答案 0 :(得分:4)

  

为什么在内部返回PromisePlus.resolve()会导致另外一个额外的承诺创建?

因为当你从then回调中返回一个promise时,它确实等待解析外部promise(从.then()返回的)。为了等待这个内在的承诺,.then(…)被调用 - 而且这个调用确实也创造了一个新的承诺。

(是的,所有这些都非常低效,这可能是应该避免承诺子类化的第一个原因。)