关于promise输出顺序的疑问?

new Promise((resolve,reject) => { console.log('外部promise') …
关注者
35
被浏览
5,073

4 个回答

.then回调可读性很差,尽量不要直接使用,用 await, 这里只是做学术探讨。

虽问题很长,但表达清晰,不过还是会有读者看不懂问题。我的回答也只回答作者关心的,就是在 .then 回调函数里 return一个已经 fulfilled 的 promise 和什么都不返回也就是 return undefined 有什么不同?

作者显然认为两者应该一样, 都应该让这个 .then()返回的 promise 对象的状态从 pending 立刻变为 fulfilled,也就是会让再后面的那个 .then 回调立刻进入 microtask 队列。

但其实不是的,如果在一个 pending 状态的 promise 对象(p)的 .then回调里返回一个 promise 对象( p2),或者任意带有 then 方法的对象,引擎会专门起一个额外的 microtask/job 去执行这个 p2then 方法,同时把 p[[resolve]][[reject]]函数作为参数传过去,虽然 p2 已经 fulfilled 了,但它能做的也就是把 [[resolve]] 函数立刻放到 microtask 队列里,这样也就过了两个 microtask,这时 p 才会被 fulfill,p 后面的 console.log('内部第二个then')才会被放入队列。

所以你才看到了慢两拍的表现,只有两拍,如果你 return的是个能同步执行 [[resolve]] 函数的 普通 thenable 对象,那就仅仅会慢一拍,比如你可以返回 {then(resolve){resolve()}}试试。

规范步骤在这里

继续浏览内容
知乎
发现更大的世界
打开
浏览器
继续

结合 @紫云飞 大佬的回答,建议你再看一下 Promise 的实现,相信你就能理解为什么会这样了。

github.com/woai3c/Front

继续浏览内容
知乎
发现更大的世界
打开
浏览器
继续