Javascript 微任务队列和宏任务队列中的混淆

Javascript 微任务队列和宏任务队列中的混淆,javascript,Javascript,我是JS的初学者,在经历事件循环和承诺时,我在mdn中遇到了下面的示例 const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); wait().then(() => console.log(4)); Promise.resolve().then(() => console.log(2)).then(() => console.log(3)); console.log(1); // 1,

我是JS的初学者,在经历
事件循环和承诺时,我在
mdn
中遇到了下面的示例

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

wait().then(() => console.log(4));
Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
console.log(1); // 1, 2, 3, 4
O/p不应该是
1,4,2,3

根据我的理解,这些是应该采取的步骤

  • 宏任务Q中的setTimeout CB
  • 微任务Q中的日志(4)CB
  • 微任务Q中的日志(2)CB
  • 微任务Q中的日志(3)CB
  • 记录(1),然后按FIFO顺序清空微任务Q。
    我在这里犯了什么错误,请解释等待
    函数的承诺只有在
    设置超时
    完成后才能解析-在宏任务(几毫秒)之后,相反,
    承诺.resolve
    被放入微任务队列,它将首先运行(通常是一毫秒或更短)。运行
    console.log(1)
    行后,将有以下内容:

    微任务队列:
    。然后(()=>console.log(2))。然后(()=>console.log(3))

    宏任务队列:
    解析
    (由于
    设置超时


    微任务队列首先运行,因此记录
    2
    ,然后记录下一个
    。然后将
    放入微任务队列,并记录
    3
    。最后,
    setTimeout
    宏任务运行,解决了
    等待
    承诺,将另一个
    。然后
    放入微任务队列,并很快导致
    4
    被记录。

    MacoTask是否应该首先运行,因为它有一个CB?然后是所有的微任务?根据下面的mdn 1。检查宏任务队列中是否有可用的任务。2.如果是,并且此任务正在运行,请等到任务完成后再转至下一步。如果没有,请直接转到步骤3。3.然后运行微任务队列中的所有微任务。在运行任何宏任务之前,微任务队列必须为空。微任务,然后是宏任务。