После прочтения спецификации и тестирования много раз я думал, что смогу ее получить.
Прежде чем мы начнем, мы должны что-то уладить.
Давайте назовем это RESOLVE()
при использовании resolve
в Promise executor
.Например, RESOLVE(thenable)
означает код, подобный следующему:
new Promise((resolve,reject)=>{
resolve(thenable)
})
, а resolve(thenable)
означает Promise.resolve(thenable)
Хорошо, давайте начнем.
Promise.resolve('non-thenable')
и RESOLVE('non-thenable')
Когда мы используем Promise.resolve('non-thenable')
, речь идет о Promise.resolve

Тогда этоприходит к PromiseResolve

Вот где Promise.resolve('non-thenable')
было преобразовано в
new Promise(resolve=>{
resolve('non-thenable')
})
Итак,у нас есть заключение:
Promise.resolve('non-thenable')
можно преобразовать в RESOLVE('non-thenable')
RESOLVE(thenable)
demo1
let resolveThenable = new Promise((resolve, reject) => {
let thenable = {
then: function (resolve, reject) {
console.log('in thenable')
resolve(42)
}
}
resolve(thenable)
// works like
// Promise.resolve().then(() => {
// thenable.then(resolve)
// })
// should be ?
// Promise.resolve().then(() => {
// thenable.then.[[Value]](resolve)
// })
// equivalent to?
// Promise.resolve().then(() => {
// thenable.then(resolve)
// })
})
resolveThenable.then(() => {
console.log('resolveThenable resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
// 'in thenable'
// 'promise1'
// 'resolveThenable resolved'
// 'promise2'
// 'promise3'
Согласно функциям разрешения обещаний , когда мы использовали RESOLVE(thenable)
, речь идет о

Затем дело доходит до PromiseResolveThenableJob

Это позволит RESOLVE(thenable)
работать как
Promise.resolve().then(() => {
thenable.then.[[Value]](resolve)
})
Итак, я подумал, что это эквивалентно
Promise.resolve().then(() => {
thenable.then(resolve)
})
, который получил тот же результат, что и RESOLVE(thenable)
.
Итак, мы можем сказать RESOLVE(thenable)
можно преобразовать в
Promise.resolve().then(() => {
thenable.then(resolve)
})
demo2
let resolvePromise = new Promise((resolve, reject) => {
let resolvedPromise = Promise.resolve()
resolve(resolvedPromise)
// works like
// Promise.resolve().then(() => {
// resolvedPromise.then(() => {
// resolve()
// })
// })
// should be?
// Promise.resolve().then(() => {
// resolvedPromise.then.[[Value]](resolve,reject)
// })
// equivalent to ?
// Promise.resolve().then(() => {
// resolvedPromise.then(resolve)
// })
// equivalent to ?
// Promise.resolve().then(() => {
// resolvedPromise.then(() => {
// resolve()
// })
// })
})
resolvePromise.then(() => {
console.log('resolvePromise resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
// 'promise1'
// 'promise2'
// 'resolvePromise resolved'
// 'promise3'
Когда мы говорили о RESOLVE(resolvedPromise)
, мы можем обнаружить, что спецификация не отличает thenable
от promise
.Таким же образом, RESOLVE(resolvedPromise)
может быть преобразован в
Promise.resolve().then(() => {
resolvedPromise.then(resolve)
})
Хотя в этом случае порядок между RESOLVE(thenable)
и RESOLVE(promise)
отличается.Потому что thenable.then
- это операция синхронизации, а resolvedPromise.then
- это асинхронная операция.Это не тот же метод then
.
Итак, вот наш вывод:
И RESOLVE(thenable)
, и RESOLVE(promise)
можно преобразовать в
new Promise((resolve, reject) => {
Promise.resolve().then(() => {
thenable.then(resolve)
})
})
Promise.resolve (затем)
Это довольно просто при использовании Promise.resolve(promise)
, потому что он возвращает аргумент promise
.
Однако при использовании Promise.resolve(thenable)
все усложняется, и thenable
не является обещанием.Давайте назовем это Promise.resolve(nonPromiseThenable)
.
Согласно Promise.resolve (x)

Тогда этоприходит к

Таким образом, Promise.resolve(nonPromiseThenable)
может быть преобразовано в
new Promise(resolve => {
resolve(nonPromiseThenable)
})
И, наконец, приходит к
new Promise(resolve => {
Promise.resolve().then(() => {
nonPromiseThenable.then(resolve)
})
})
Вы можете проверить это в демоверсии ниже.
var thenable = {
then(resolve, reject) {
resolve(1)
}
}
// code transformation
Promise.resolve(thenable).then(res => {
console.log(res)
})
// equal
// new Promise(resolve => {
// resolve(thenable)
// }).then(res => {
// console.log(res)
// })
// equal
// new Promise(resolve => {
// Promise.resolve().then(() => {
// thenable.then(resolve)
// })
// }).then(res => {
// console.log(res)
// })
new Promise(resolve => resolve(2))
.then(res => {
console.log(res)
})
.then(res => console.log(3))
В конце давайте сделаем вывод:
Promise.resolve('nonThenable')
можно преобразовать в RESOLVE('nonThenable')
.Они имеют одинаковые эффекты. Promise.resolve(thenable)
отличается от RESOLVE(thenable)
.Они имеют разные эффекты. RESOLVE(thenable)
и RESOLVE(promise)
могут быть преобразованы в
new Promise((resolve, reject) => {
Promise.resolve().then(() => {
thenable.then(resolve)
})
})
Promise.resolve(promise) === promise
, в то время как Promise.resolve(nonPromiseThenable)
могут быть преобразованы в
new Promise(resolve => {
Promise.resolve().then(() => {
nonPromiseThenable.then(resolve)
})
})