我是javascript的新手,来自固件/嵌入式系统/ RTOS背景。我不理解JS promise的上下文切换的概念。
对于这个脚本:
setTimeout(() => { console.log("Hello"); }, 3000);
我可以理解回调是在事件循环任务中注册的,脚本一直持续到完成并退出。事件循环运行并执行任何到期的任务/回调。
对于这个脚本:
var pr = new Promise(function(resolve, reject) {
setTimeout(() => { resolve() }, 3000);
});
pr().then(() => {
console.log("Hello");
});
是否意味着脚本将运行pr()
,退出脚本,运行事件循环。一旦事件循环执行回调(调用resolve()
),JS将再次将上下文切换到脚本,并运行then()
子句中的任何内容?
或者脚本将运行直到完成,但then()
子句在调用resolve()
时在事件队列中注册为回调。然后事件队列将执行then()
子句?
感谢您的帮助
答案 0 :(得分:2)
第二个,而不是。 Promises are just an abstraction atop callbacks,这里没有任何魔力。
脚本运行直到完成,创建承诺并调用setTimeout
(在计时器上安装其回调)并调用then
(在承诺上安装其回调)。然后事件循环将前进并运行超时回调,该回调调用resolve
,这反过来导致将执行promise回调。