返回
利用event loop事件循环透彻理解Promise基础题
前端
2023-11-07 19:57:03
引言
在现代编程领域,事件循环(event loop)是一项至关重要的技术,它负责协调异步任务的执行。而作为异步编程的基石之一,Promise的概念也备受关注。本文将通过一道Promise基础题,带领读者深入理解event loop事件循环的运作机制,并揭示Promise在异步编程中的作用。
Promise基础题
问题:
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
Promise.resolve().then(() => {
console.log(3);
});
console.log(4);
这段代码的输出顺序是什么?
解答
要想弄清代码的输出顺序,就必须先理解event loop的运作机制。
Event loop事件循环
事件循环是一种消息队列机制,它负责处理来自不同来源的事件,例如用户交互、网络请求、定时器回调等。事件循环的核心思想是:将任务放入队列,然后依次执行。
事件循环主要包含以下几个阶段:
- 任务队列阶段 :在此阶段,事件循环会从任务队列中取出任务并执行。任务队列是一个先进先出(FIFO)队列,这意味着最早放入队列的任务将首先被执行。
- 检查阶段 :在这个阶段,事件循环会检查是否有新的事件产生。如果有,则将新事件放入事件队列。
- 执行阶段 :如果事件队列和任务队列都不为空,则事件循环会从事件队列中取出一个事件并执行。如果事件队列为空,则事件循环会从任务队列中取出一个任务并执行。
Promise与事件循环
Promise是一种异步编程工具,它允许你将异步操作的结果传递给后续操作。Promise对象代表一个异步操作的最终完成或失败。
Promise与事件循环的关系如下:
- 当一个Promise对象被创建时,它会立即被放入事件队列。
- 当事件循环执行Promise对象时,会根据Promise对象的状态(已完成或已失败)来调用相应的回调函数。
- 如果Promise对象的状态是已完成,则会调用then()方法指定的回调函数。
- 如果Promise对象的状态是已失败,则会调用catch()方法指定的回调函数。
回到代码
现在,我们回到代码本身,并分析其输出顺序:
- console.log(1)首先被执行,因为这是同步代码,它会在代码执行时立即输出1。
- setTimeout()方法将一个回调函数放入事件队列,该回调函数将在0毫秒后执行。
- Promise.resolve()方法创建一个已完成的Promise对象,该Promise对象立即被放入事件队列。
- console.log(4)随后被执行,因为这是同步代码,它会在代码执行时立即输出4。
- 事件循环现在开始执行事件队列中的任务。首先,它执行已完成的Promise对象,然后调用then()方法指定的回调函数,输出3。
- 最后,事件循环执行setTimeout()方法的回调函数,输出2。
因此,这段代码的输出顺序为:1、4、3、2。
结语
通过对这道Promise基础题的剖析,我们对event loop事件循环的执行机制和Promise在异步编程中的作用有了更深入的了解。希望本文能帮助读者在异步编程领域更上一层楼。