promise.then 中 return Promise.resolve 后，发生了什么？
我把整个过程详细分解说一下，同学们就明白了。 接下来的阅读注意两点：一是不要被网上流行的一些帮助初学者快速了解的不严密说法先入为主，跳不出误区。二是不要混淆两个 resolve，即 Promise.resolve （全局对象 Promise（它当然也是构造子）的属性 resolve 函数对象）和 new Promise((resolve, reject)=>...) 里的 resolve（其实质是规范中的 Promise Resolve Function，链接在文末。）。（then 创建新 Promise 实例，其中一个子步骤相当于调用 new Promise((resolve, reject)=>...)。） 别的不说了，照着代码，我们先来看初始任务。 此时，任务列队上有两个新任务，分别包含有 console.log(0);return Promise.resolve(4) 和 console.log(1) 。我们用 「Job { ??? }」来指代。 接下来，「Job { console.log(0);return Promise.resolve(4) }」先被 enqueue，所以先运行「Job { console.log(0);return Promise.resolve(4) }」。 此时，任务列队上还是有两个任务（一进一出），「Job { console.log(1) }」和「NewPromiseResolveThenableJob(promise0, 「Promise { 4 }」, 「Promise { 4 }」.then)」。接下来执行「Job { console.log(1) }」。 此时，任务列队上仍然有两个任务（一进一出）。「NewPromiseResolveThenableJob(...)」和 「Job { console.log(2) }」。执行「NewPromiseResolveThenableJob(...)」。 此时，任务列队上依旧有两个任务（一进一出）。「Job { console.log(2) }」和 「Job { promise0 的 resolve }」。执行「Job { console.log(2) }」。 此时，任务列队上依然有两个任务（一进一出）。「Job { promise0 的 resolve }」和「Job { console.log(3) }」。执行「Job { promise0 的 resolve }」。 此时，任务列队上还是两个任务（一进一出）。「Job { console.log(3) }」和「Job { console.log(res) }」。 此时，任务列队上还是两个任务（一进一出）。「Job { console.log(res) }」和「Job { console.log(5) }」。 此时，任务列队上终于不再是两个任务了。下剩「Job { console.log(5) }」。 最后一个任务（追加任务九）输出「6」。任务列队清空。 因此，输出的顺序是「0 1 2 3 4 5 6」。 总结一下，除去初始任务，总共 enqueue 了 9 个任务。其中，第一串 Promise + then... enqueue 了 4 个。第二串 Promise + then... enqueue 了 5 个。分析可知，每增加一个 then 就会增加一个任务入列。而且，第一串的 return Promise.resolve(4) 的写法额外 enqueue 了 2 个任务，分别在 promise0 的 resolve 时（追加任务一 3.）和调用「Promise { 4 }」的 then 本身时（追加任务三 2.）。根据规范，它就该这样。说不上什么巧合，可以算是有意为之。处理程序里返回 thenable 对象就会导致增加两个任务入列。 所以，答主希望看 V8 实现的方式弄明白是比较麻烦的，因为涉及很多分散的部分，光看其中几处也没用。 放上新版规范书（草稿）。（书内可搜关键字：Promise Objects，Promise ( executor )，Promise Resolve Function，Promise Resolve Functions，Promise Reject Functions，TriggerPromiseReactions，PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )，Promise.resolve ( x )，NewPromiseReactionJob ( reaction, argument ) 等。） 最后，我仿照 JavaScript 的 Promise 在 C++ 里写了个 Promise 实现。虽然不是完整复刻，但能提供一些关键思路。