我最近开始阅读 NodeJS(和 JS),对回调在 NodeJs 中的工作方式有点困惑。假设我们做这样的事情:
setTimeout(function(){
console.log("World");
},1000);
console.log("Hello");
输出:“你好世界”
到目前为止,我读到的 JS 是单线程的,所以事件循环通过一个大堆栈,并且我还被告知不要在回调函数中放置大调用。
1)
好的,所以我的第一个问题是假设它的一个堆栈回调函数是否由主事件循环线程运行?如果是这样,那么如果我们有一个站点通过回调(从数据库获取并推送请求)提供内容,并且我们有 1000 个并发,那么这 1000 个用户基本上是同步服务的,主线程在每个回调函数中执行计算然后继续主事件循环?如果是这种情况,这究竟是如何并发的?
2)如何将回调函数添加到堆栈中,所以可以说我的代码如下所示:
setTimeout(function(){
console.log("Hello");
},1000);
setTimeout(function(){
console.log("World");
},2000);
那么回调函数是否会在超时发生之前添加到堆栈中?如果是这样,是否设置了一个标志来通知主线程回调函数已准备好(或者是否有另一种机制)。如果这确实是正在发生的事情,它不仅会使堆栈膨胀,尤其是对于具有回调函数的大型 Web 应用程序,而且堆栈越大,运行所需的时间就越长,因为线程必须单步执行整个事情。