我无法理解为什么我的以下代码按顺序记录以下内容: “结束” “超时完成” “承诺”
我认为“承诺”将在“超时完成”之前记录,因为它比回调队列任务(setTimeout)优先。 根据这一观察,我的假设是直到调用.then之前,promise不会排队,因为它尚未准备好,因此允许setTimeout在回调队列中首先执行。这是正确的吗?
const sampleFunction = function(e) {
setTimeout(() => console.log('timeout done'), 0)
const data = fetch(`https://jsonplaceholder.typicode.com/comments/1`)
.then(response => {
return response.json();
})
.then(json => {
/*doSomething*/
console.log('promise')
});
console.log('end')
}
答案 0 :(得分:0)
您的console.log('promise')
必须等待,直到完成fetch().then()
,这涉及到另一台主机的联网操作(因此是非零时间)。
您的setTimeout()
只需要等到sampleFunction()
返回并返回事件队列即可。因此,由于fetch().then()
是非阻塞的,并且花费的时间也不为零,因此当您第一次返回事件队列时,只有setTimeout()
可以使用了。联网操作仍将在后台进行。
因此,这不是优先事项。这是完成顺序的问题。 setTimeout()
在解决fetch()
承诺之前很久就将其完成事件插入事件队列。
也许您没有意识到fetch()
是非阻塞的,调用它只是启动操作,然后代码执行会继续吗?
在控制台中,您应该看到:
end
timeout done
promise
只要您的fetch()
没有任何错误。