J'essayais de comprendre la différence entre resolve(thenable)
et resolve('non-thenable-object')
.
Dans les exemples ci-dessous, utilisez promesse au lieu de thenable
car promesse est également thenable
et peut être plus facile à comprendre.
resolve(promise)
let resolvePromise = new Promise(resolve => {
let resolvedPromise = Promise.resolve()
resolve(resolvedPromise)
})
resolvePromise.then(() => {
console.log('resolvePromise resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
résultat:
resolve('non-thenable-object')
let resolvePromise = new Promise(resolve => {
resolve('non-thenable-object')
})
resolvePromise.then(() => {
console.log('resolvePromise resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
résultat:
Donc, j'ai vérifié la spécification et trouvé Promise Resolve Functions . Puis arrivé à PromiseResolveThenableJob et EnqueueJob .
Donc, selon les spécifications, je pense que demo1 était comme
let resolvePromise = new Promise(resolve => {
let resolvedPromise = Promise.resolve()
// resolve(resolvedPromise)
// works like
Promise.resolve().then(() => {
Promise.resolve(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')
})
Je pense que oui parce que Promise Resolve Functions dit:
- Effectuer EnqueueJob ("PromiseJobs", PromiseResolveThenableJob, "promise, resolution, thenAction").
Et PromiseResolveThenableJob dit:
Ce Job utilise la méthode thenable fournie et sa méthode then pour résoudre la promesse donnée. Ce processus doit avoir lieu en tant que tâche pour garantir que l'évaluation de la méthode then a lieu après l'évaluation de tout code environnant.
Aussi, je pense que demo2 fonctionne comme
//let resolvePromise = new Promise(resolve => {
//resolve('str')
//})
//works like
let resolvePromise = Promise.resolve('str')
resolvePromise.then(() => {
console.log('resolvePromise resolved')
})
let resolvedPromiseThen = Promise.resolve().then(res => {
console.log('promise1')
})
resolvedPromiseThen
.then(() => {
console.log('promise2')
})
.then(() => {
console.log('promise3')
})
Comme le Promise Resolve Functions dit:
Si IsCallable (thenAction) est false, alors Renvoyez FulfillPromise (promesse, résolution).
Bien que les résultats entre Demo1 -Demo3 et Demo2 -Demo4 soient égaux, je ne suis toujours pas sûr d'avoir raison. Donc, je suis ici pour demander
si ma logique est correcte? Sinon, comment expliquez-vous les différents ordres entre resolve(thenable)
et resolve(non-thenable)
?
Oui, votre logique semble juste.
new Promise(resolve => resolve('non-thenable-object'))
est équivalent à Promise.resolve('non-thenable-object')
à toutes fins utiles.
Dans votre Demo3, je vous recommanderais toutefois de ne pas utiliser Promise.resolve(resolvedPromise)
. Je ne suis pas sûr que ce soit intentionnel ou non, mais Promise.resolve
a un raccourci lorsque son argument est déjà une promesse, puis renvoie la resolvedPromise
telle quelle. Vous préférez écrire
new Promise((resolve, reject) => {
let resolvedPromise = Promise.resolve();
// resolve(resolvedPromise) works like
Promise.resolve().then(() => resolvedPromise.then(resolve, reject));
});