web-dev-qa-db-fra.com

Quelle est la différence entre resol (thenable) et resolve ('non-thenable-object')?

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.

Demo1: 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: 

  • promesse 1
  • promesse2
  • resolut résolution résolue
  • promesse3

Demo2: 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: 

  • resolut résolution résolue
  • promesse 1
  • promesse2
  • promesse3

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 

Demo3:

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:

  1. 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

Demo4:

//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)?

5
xianshenglu

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));
});
2
Bergi