为了理解Node.js的异步特性,我读了一些Node.js文章,其中我发现了这篇文章并非常喜欢 Node.js, Doctor’s Offices and Fast Food Restaurants – Understanding Event-driven Programming
有一个叫做EventLoop
的东西,它是基于FIFO(先进先出)队列的。当异步函数被触发时,它被放入EventLoop中,然后将在那里继续执行。
我有点困惑。例如在这里就说:
实际上,像setTimeout和setInterval这样的异步函数会被推入称为事件循环的队列中。
同一篇文章中还说:
事件循环是回调函数的队列。当异步函数执行时,回调函数被推入队列中。直到异步函数执行完毕后,JavaScript引擎才开始处理事件循环。
但这与下面的图片不同:
让我们看下面的例子:
console.log("Hello,");
setTimeout(function(){console.log("World");},0);
根据我理解,这些不同的解释得出:
- 第一个说,
setTimeout()
函数中的function(){console.log("World");}
部分(回调函数)将被放入事件循环中。一旦setTimeout
完成,它也会执行EventLoop
。 - 另一个人说,整个东西
setTimeout(function(){console.log("World");},0);
将被放入事件循环中并将被执行...
我现在更加困惑了。这应该是一件简单的事情,但我想对以下问题给出一个好但简单的解释:
- 前面提到的哪一个说法是正确的?
- 什么是事件循环?是一个类比、一个具有方法、对象等的实际事物吗?
- 如果我想从头开始实现一个类似于事件循环的东西,它会是什么样子?可以看一下代码。