Javascript 在Promise之前如何调用此setTimeout?

Javascript 在Promise之前如何调用此setTimeout?,javascript,node.js,promise,Javascript,Node.js,Promise,所以在过去的一天里,我一直在研究事件循环和微观/宏观任务队列。我看到很多人对以下代码有直接的矛盾: setTimeout(() => console.log("A"), 0); const futureData = fetch('someUrl') // assume this takes 300ms futureData.then(x => console.log("B")) console.log("C") // output -> C, A, B // what m

所以在过去的一天里,我一直在研究事件循环和微观/宏观任务队列。我看到很多人对以下代码有直接的矛盾:

setTimeout(() => console.log("A"), 0);

const futureData = fetch('someUrl') // assume this takes 300ms
futureData.then(x => console.log("B"))

console.log("C")

// output -> C, A, B
// what multiple JS instructors says the output will be -> C, B, A
我得到的实际输出写在上面。然而,在我正在学习的课程中,讲师们认为,由于
futureData
是一个承诺,它会被推到微任务队列中,并且由于它被推到微任务队列中,它会在任何宏任务(如setTimeout)之前首先执行

但在运行之后,这显然是错误的?这里有我遗漏的东西吗?为什么合格的讲师会这样说,我几乎可以肯定我遗漏了一条关键信息

我的想法是,只有已解决的承诺才会被推送到微任务队列,而所有未决的承诺都必须等到未来的事件循环轮


我错过了什么

我认为将异步任务推送到微/宏任务只能在WebAPI或其他线程处理了异步部分并且只有回调被推送到队列之后才能完成,这些回调将在主线程本身上运行


由于
fetch
大约需要
300ms
,当堆栈为空时,promise回调在微任务队列中还不存在,但SetTimeout回调在宏中存在。

SetTimeout()
fetch()
的比较不是一个公平的测试。如果
fetch()。试着用
setTimeout()
Promise.resolve(“B”)
比赛。@Roamer-1888是的,在这种情况下
Promise.resolve(“B”)
总是赢的。我认为这基本上可以归结为,在所有同步操作运行之前,微任务是否有足够的时间排队。我认为这可以归结为
fetch()
是一个冗长的操作。