使用静态值创建已解决的 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 的幕后发生了什么?
如果我用延迟 0
将 console.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 对象封装的操作中实际发生了什么。
Promise.resolve("resolved").then(function(result) {
console.log(result)
});
console.log("promise created");
结果:
"promise created"
"resolved"
我的问题是:为什么执行仍然是异步的? Promise 的幕后发生了什么?
如果我用延迟 0
将 console.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 对象封装的操作中实际发生了什么。