resolve(soable)和resolve('non-thenable-object')之间有什么区别?

xia*_*glu 7 javascript node.js promise

我试图理解之间的差异resolve(thenable)resolve('non-thenable-object').

在下面的示例中,使用promise而不是thenable因为promise也thenable可以更容易理解.

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')
  })
Run Code Online (Sandbox Code Playgroud)

结果:

  • promise1
  • promise2
  • resolvePromise已解决
  • promise3

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')
  })
Run Code Online (Sandbox Code Playgroud)

结果:

  • resolvePromise已解决
  • promise1
  • promise2
  • promise3

所以,我检查了规范并找到了Promise Resolve Functions .然后到了PromiseResolveThenableJobEnqueueJob.

所以,根据规范,我认为demo1就像

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')
  })
Run Code Online (Sandbox Code Playgroud)

我想是因为Promise Resolve Functions说:

  1. 执行EnqueueJob("PromiseJobs",PromiseResolveThenableJob,«promise,resolution,thenAction»).

PromiseResolveThenableJob说:

此作业使用提供的thenable及其then方法来解析给定的promise.此过程必须作为作业进行,以确保在评估任何周围代码完成后对then方法进行评估.

另外,我认为demo2就像

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')
  })
Run Code Online (Sandbox Code Playgroud)

正如Promise Resolve Functions所说:

如果IsCallable(thenAction)为false,则返回FulfillPromise(promise,resolution).

虽然Demo1 - Demo3Demo2 - Demo4之间的结果相同,但我仍然不确定我是否正确.所以,我在这里问

我的逻辑是否正确?如果没有,你如何解释resolve(thenable)和之间的不同命令resolve(non-thenable)

Ber*_*rgi 2

是的,你的逻辑看起来是正确的。

new Promise(resolve => resolve('non-thenable-object'))相当于用于Promise.resolve('non-thenable-object')所有目的。

不过,在您的 Demo3 中,我建议省略Promise.resolve(resolvedPromise). 我不确定这是否是有意的,但是Promise.resolve当它的参数已经是一个承诺时,确实有一个快捷方式,然后按resolvedPromise原样返回。你宁愿写

new Promise((resolve, reject) => {
  let resolvedPromise = Promise.resolve();
  // resolve(resolvedPromise) works like 
  Promise.resolve().then(() => resolvedPromise.then(resolve, reject));
});
Run Code Online (Sandbox Code Playgroud)