当我们在 Promise 解决之前调用 .then 时到底发生了什么?

What happens exactly when we call .then before a Promise is resolved?

var promise1 = new Promise(resolve => setTimeout(resolve, 5000, 123));

setTimeout(_ => { 
  promise1.then(console.log) 
}, 500);

then 告诉 promise 完成后要做什么。你应该总是期望在它被解决之前调用它。但是,考虑到开发人员很聪明,承诺是否在此之前 resolves 可以被调用并不重要。

所提供的函数将在 promise 解析后排队并触发。它还将 return 一个新的承诺,该承诺将通过上述功能的 return 值来实现或拒绝。

如果承诺已经确定,函数将在事件循环的下一个时间点被触发。

在您的示例中,提供的函数仍会在做出承诺后 5 秒记录它,即在调用第二次超时后 4.5 秒。