Javascript 微任务队列和宏任务队列中的混淆
我是JS的初学者,在经历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,
事件循环和承诺时,我在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.然后运行微任务队列中的所有微任务。在运行任何宏任务之前,微任务队列必须为空。微任务,然后是宏任务。