实际上,我不知道如何在真正的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
处理程序
new PromisePlus((resolve, reject) => {
resolve()
}).then(() => {
return new PromisePlus((resolve, reject) => {
resolve('BAD')
})
}).then(msg => {
console.log(msg)
})
显然,PromisePlus.resolve()
会产生新的承诺,但为什么在PromisePlus.resolve()
内返回then
会导致更多额外的承诺创建?
答案 0 :(得分:4)
为什么在内部返回
PromisePlus.resolve()
会导致另外一个额外的承诺创建?
因为当你从then
回调中返回一个promise时,它确实等待解析外部promise(从.then()
返回的)。为了等待这个内在的承诺,.then(…)
被调用 - 而且这个调用确实也创造了一个新的承诺。
(是的,所有这些都非常低效,这可能是应该避免承诺子类化的第一个原因。)