【发布时间】:2019-05-22 11:20:02
【问题描述】:
我试图了解resolve(thenable) 和resolve('non-thenable-object') 之间的区别。
在下面的示例中,使用 promise 而不是 thenable,因为 promise 也是 thenable,可能更容易理解。
演示1: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')
})
结果:
- 承诺1
- promise2
- resolvePromise 已解决
- 承诺3
演示2: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')
})
结果:
- resolvePromise 已解决
- 承诺1
- promise2
- 承诺3
所以,我检查了规范并找到了Promise Resolve Functions .然后到PromiseResolveThenableJob和EnqueueJob。
所以,根据规范,我认为 demo1 就像
演示3:
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')
})
我这么认为是因为Promise Resolve Functions 说:
- 执行 EnqueueJob("PromiseJobs", PromiseResolveThenableJob, « promise, resolution, thenAction »)。
这个 Job 使用提供的 thenable 和它的 then 方法来解决给定的 promise。 此过程必须作为作业进行,以确保在对任何周围代码的评估完成后对 then 方法进行评估。
另外,我认为 demo2 像
演示4:
//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')
})
正如Promise Resolve Functions 所说:
如果 IsCallable(thenAction) 为 false,则返回 FulfillPromise(promise, resolution)。
虽然 Demo1-Demo3 和 Demo2-Demo4 之间的结果相等,但我仍然不确定如果我是对的。所以,我是来问的
我的逻辑是否正确?如果不是,你如何解释不同的命令
在resolve(thenable) 和resolve(non-thenable) 之间?
【问题讨论】:
-
我一般建议不要依赖不相关的 Promise 之间的回调调用顺序。尽管规范给出了特定的排队语义,但它在实践中永远不相关。如果您需要特定的顺序,因为您的回调相互依赖,请通过将您的 Promise 一个接一个地链接来明确这一点。
-
@Bergi,实际上,在实践中,我总是使用 Promise 链来控制异步顺序。但是我真的很想了解规范和原理。
-
赞成评论。为了理解而理解规范并没有什么错,即使在实践中依赖它并不好。
标签: javascript node.js promise