Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用静态值创建已解决的承诺-为什么执行仍然是异步的_Javascript_Asynchronous_Es6 Promise - Fatal编程技术网

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"