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