Javascript 使用静态值创建已解决的承诺-为什么执行仍然是异步的
结果:Javascript 使用静态值创建已解决的承诺-为什么执行仍然是异步的,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,结果: Promise.resolve("resolved").then(function(result) { console.log(result) }); console.log("promise created"); 我的问题是:为什么执行仍然是异步的?承诺背后发生了什么 如果我将console.log包装在setTimeout中并延迟0,那么承诺解析发生在console.log之前,对promise.resolve(…)的初始调用是同步的,但在中链接的任何内容都是同步的。然后()
Promise.resolve("resolved").then(function(result) {
console.log(result)
});
console.log("promise created");
我的问题是:为什么执行仍然是异步的?承诺背后发生了什么
如果我将
console.log
包装在setTimeout
中并延迟0
,那么承诺解析发生在console.log
之前,对promise.resolve(…)
的初始调用是同步的,但在中链接的任何内容都是同步的。然后()
由于在引擎盖下实现了同步,因此块始终是异步的
您的console.log(“promise created”)代码>在您的承诺链之外调用,因此在最初的promise.resolve(…)调用之后立即执行
由于您的console.log(“promise created”)
在您的承诺链之外,一旦出现对promise.resolve(…)
的初始调用,就会执行控制台日志。Ian的回答侧重于技术实现-非常感谢。我想发布更多关于JavaScript并发模型“为什么”的答案(我在Pluralsight上观看《现代异步JavaScript》时意识到了这一点)
让我们想象一段代码:
let progressStatus;
函数opThatReturnsPromise(){
返回承诺。解决();
}
opThatReturnsPromise()。然后(函数(){
console.log(progressStatus=“Done”);
})
console.log(progressStatus=“In progress…”);
因为承诺总是异步的。不变行为==不太难找到bug。另请参阅,因为一旦进入异步世界,除非你时间旅行到未来,否则没有出路。我猜你必须研究JS的事件队列和作业队列。然后它会自动变得有意义
"promise created"
"resolved"