我正在考虑它,这就是我想出的:
让我们看看下面的这段代码:
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
or Async
。它继续在其他方面工作。
执行结果如下:
数据库
所以基本上第二个setTimeout
首先完成并且它的回调函数比第一个更早执行,这是有道理的。
我们在这里谈论的是单线程应用程序。JS 引擎继续执行此操作,除非完成第一个请求,否则不会执行第二个请求。但好处是它不会等待阻塞操作setTimeout
解决,所以它会更快,因为它接受新的传入请求。
但我的问题围绕以下项目出现:
#1:如果我们谈论的是单线程应用程序,那么setTimeouts
在 JS 引擎接受更多请求并执行它们的同时,是什么机制处理的?单线程如何继续处理其他请求?setTimeout
当其他请求不断进来并被执行时,什么是有效的。
#2:如果这些setTimeout
函数在后台执行,而更多的请求正在传入和执行,那么在后台执行异步执行的是什么?我们谈论的这个东西叫做EventLoop
什么?
#3:但是不应该把整个方法放在里面,EventLoop
这样整个事情就会被执行并调用回调方法吗?这是我在谈论回调函数时的理解:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
但是在这种情况下,JS 引擎如何知道它是否是一个异步函数,以便它可以将回调放在EventLoop
? 也许像async
C# 中的关键字或某种指示 JS 引擎将采用的方法的属性是异步方法,应该相应地进行处理。
#4:但是一篇文章说的与我对事情可能如何运作的猜测完全相反:
事件循环是一个回调函数队列。当异步函数执行时,回调函数被推入队列。在异步函数执行之后的代码之前,JavaScript 引擎不会开始处理事件循环。
#5:这里有这张图片可能会有所帮助,但图片中的第一个解释与问题 4 中提到的完全相同:
所以我在这里的问题是对上面列出的项目进行一些澄清?