首页 > 试题广场 >

在浏览器或者 Node.js 环境下执行以下代码片段,...

[不定项选择题]
在浏览器或者 Node.js 环境下执行以下代码片段,输出的结果可能为?
console.log(1);
    setTimeout(function() {
    console.log(2);
}, 0);
new Promise((resolve, reject) => {
    console.log(3);
    resolve();
})
.then(() => {
    console.log(4);
});
console.log(5);

  • 1 3 5 4 2
  • 1 2 3 4 5
  • 1 5 3 4 2
  • 1 3 5 2 4
先执行同步, 再执行异步
异步,先微队列,再宏队列
发表于 2019-05-02 17:27:56 回复(4)
不是选D么   异步任务  执行完不是才执行微任务么   

发表于 2020-09-13 11:56:15 回复(0)
// 1. setTimeout和setImmediate都是宏任务,都会在下一轮宏任务执行
// 两者执行顺序不一定的!
setTimeout(function(){
	console.log("虽然是第一个宏任务,但是需要等待的时间较长,所以先执行其他阶段,之后重新进入timers阶段")
},3000)
setTimeout(function(){
	console.log('setTimeout')
},0)
setImmediate(function(){
	console.log('immediate')
})
// 虽然promise和process.nextTick都是属于异步任务,但是process.nextTick是异步任务中最快的!
// 所以一直都是先输出3,再输出1
new Promise((res,rej)=>res(1)).then(res=>console.log(res))
process.nextTick(()=>console.log("3"))
console.log("第一轮宏任务")

// 事件循环分为以下几个阶段:
// 1. timers:定时器阶段,处理setTimeout和setInterval的回调函数,如果定时器和计时器是属于本轮宏任务的话,否则就执行下个阶段,
// 2. I/O callback阶段:`执行非计时器的回调函数,也就是除了setTimeout/setInterval/setImmediate`,
// 3. idle,prepare:`只是node.js的libuv内部调用,可以忽略`,
// 4. Poll:轮询阶段,等待未返回的I/O事件,比如`服务器的响应,用户鼠标移动`等,
// 轮询阶段一般时间比较长,如果没有其他异步任务要处理,会一直停留在此处,等待I/O返回结果
// 5. check阶段:执行setImmediate的回调函数,
// 6. close callback:执行关闭请求的回调函数,如关闭套接字

// 由于setTimeout在timers阶段执行,而setImmediate在check阶段执行,所以理论上setTimeout会比setImmediate先执行
// 虽然setTimeout可以设置时间为0,但是node服务器做不到0毫秒,最少也要1毫秒
// 所以实际上,在等待timers阶段会结束,先执行其他阶段,去执行setImmediate,之后再去执行setTimeout
// 因此,输出顺序不一定!
// 推荐:http://www.ruanyifeng.com/blog/2018/02/node-event-loop.html 

发表于 2020-04-08 23:35:29 回复(0)
promise.then才是微队列
发表于 2020-03-13 19:49:00 回复(0)

我总觉得选C


发表于 2019-09-26 22:48:58 回复(0)
Ped头像 Ped
我也觉得选C,但为什么结果是A? promise不是微任务吗?怎么比主线程还执行?
编辑于 2019-09-23 21:08:36 回复(2)