JS事件循环

setTimeout(() => { console.log(1) }, 1000)
new Promise(resolve => {
    setTimeout(() => { resolve(2) }, 1000)
}).then(data => {
    console.log(data); // 我主要不清楚then属于哪次事件循环
});
console.log(3)

请问上面一共有几次事件循环?then属于哪一次事件循环?每次事件循环都打印什么?对比下面这个事例。

new Promise(resolve => {
    console.log('1');
    for(var i = 0; i < 1000; i++) {
        i == 99 && resolve();
    }
    console.log('2');
}).then(function() {
    console.log('3');
})
console.log(4)
这个事例是只有一个事件循环,then是属于第1个事件循环中的微任务
阅读 2k
4 个回答

事件循环是指一个机制,里面分为宏任务和微任务。上面这个代码开始执行,遇到setTimeout会把回调函数放入宏任务队列,遇到new Promise, 会先执行构造函数里的方法,也就是 setTimeout(() => { resolve(2) }, 1000), 同样会把这个回调函数放入宏任务队列,然后执行 console.log(3), 输出3, 接着先执行微任务队列,发现里面没有任务,结束。至此,一次循环完成。然后开始下一轮循环,执行宏任务中的代码,也就是console.log(1),输出1,然后扫描微任务,发现没有,结束。然后开始第三次循环,执行宏任务,也就是 resolve(2),此时会把then方法也就是 console.log(data); 加入promise任务源,然后执行微任务,输出2。
所以一共循环3次,输出 3 ,隔1秒,输出 1 ,2

then是接收到上一次的resolve的才执行,所有根据你的代码输出结果会是

3,1,2

3输出就不说了
Promise的结果就是一个settimeout的console,所以1和2个效果是一样的,根据执行顺序输出结果就是1、2

这个没有循环吧,setTimeout是定时函数,表示几秒后执行,promise是承诺,then后的函数是在promise函数里执行完了以后在执行,可以按照这个思路判断一下执行顺序,执行结果可以自己在控制台执行一遍就知道了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题