使用静态值创建已解决的 Promise - 为什么执行仍然是异步的

Creating already resolved Promise with static value - why execution is still asynchronous

Promise.resolve("resolved").then(function(result) { 
  console.log(result)
});
console.log("promise created");

结果:

"promise created"
"resolved"

我的问题是:为什么执行仍然是异步的? Promise 的幕后发生了什么?

如果我用延迟 0console.log 包装在 setTimeout 中,那么 promise 解析会在 console.log

之前发生

Promise.resolve(...) 的初始调用是同步的,但是您在 .then() 块中链接的任何内容都将 始终 是异步的,因为event loop 在引擎盖下实现。

您的 console.log("promise created"); 是在您的承诺链之外调用的,因此会在您最初的 Promise.resolve(...) 调用后立即执行。

由于您的 console.log("promise created"); 在您的承诺链之外,一旦对 Promise.resolve(...) 的初始调用发生,就会执行控制台日志。

Ian 的回答侧重于技术实现 - 非常感谢。我想要 post 关于 JavaScript 并发模型侧重于 "why" 的附加答案(我在观看 现代异步 JavaScript 在 Pluralsight 上。

让我们想象一段代码:

let progressStatus;

function opThatReturnsPromise() {
  return Promise.resolve();
}

opThatReturnsPromise().then(function() {
  console.log(progressStatus = "Done");
})

console.log(progressStatus = "In progress...");

如果 "static" Promise 是同步解决的,那么这部分将导致输出:

Done
In progress...

这是因为Run-to-completion。因此确保异步性,确保一致的行为 - 无论在由 Promise 对象封装的操作中实际发生了什么。