我正在考虑,这是我想到的:
假设我们有这样的代码:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
一个请求进入,并且JS引擎逐步开始执行上述代码。前两个呼叫是同步呼叫。但是当涉及到setTimeout
方法时,它将成为异步执行。但是JS立即从中返回并继续执行,这称为Non-Blocking
或Async
。并且它继续在其他等等上工作。
执行结果如下:
交流数据库
因此,基本上第二个setTimeout
首先完成,其回调函数比第一个更早执行,这很有意义。
我们在这里谈论单线程应用程序。JS Engine会继续执行此操作,除非它完成第一个请求,否则它将不会转到第二个请求。但好处是它不会等待像setTimeout
解析这样的阻塞操作,因此它会更快,因为它接受新的传入请求。
但是我的问题围绕以下几个方面提出:
#1:如果我们在谈论单线程应用程序,那么setTimeouts
当JS引擎接受更多请求并执行它们时,什么机制会处理?单线程如何继续处理其他请求?setTimeout
在其他请求不断进入并被执行的同时,什么起作用。
#2:如果这些setTimeout
函数在更多请求传入并正在执行时在后台执行,那么在后台执行异步执行的是什么?我们所说的这个东西叫EventLoop
什么?
#3:但是不应该将整个方法都放入EventLoop
以便执行整个过程并调用回调方法吗?这是我在谈论回调函数时所了解的:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
但是在这种情况下,JS引擎如何知道它是否是一个异步函数,以便可以将回调函数放在EventLoop? Perhaps something like the
C#中的async`关键字中或某种表明JS引擎将采用的方法的属性是异步方法并应予以相应对待。
#4:但是一篇文章说与我猜测事情可能如何运作完全相反:
事件循环是回调函数的队列。当执行异步函数时,回调函数将被推入队列。在执行异步函数后的代码之前,JavaScript引擎不会开始处理事件循环。
#5:这里有这张图片可能会有所帮助,但是图片中的第一个解释是说问题4中提到的完全相同的内容:
因此,我的问题是要对上述项目进行一些澄清?