相关疑难解决方法(0)

了解事件循环

我在想它,这就是我提出的:

假设我们有这样的代码:

console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Run Code Online (Sandbox Code Playgroud)

请求进来,JS引擎开始逐步执​​行上面的代码.前两个呼叫是同步呼叫.但是当谈到setTimeout方法时,它就变成了异步执行.但是JS立即从它返回并继续执行,这被称为Non-BlockingAsync.并继续致力于其他等

执行结果如下:

ACDB

所以基本上第二个setTimeout完成第一个,它的回调函数比第一个更早执行,这是有道理的.

我们在这里谈论单线程应用程序.JS引擎继续执行此操作,除非它完成第一个请求,否则它不会进入第二个请求.但好处是它不会等待阻塞操作,比如setTimeout解决所以它会更快,因为它接受新的传入请求.

但我的问题出现在以下几个方面:

#1:如果我们讨论的是单线程应用程序,那么setTimeouts当JS引擎接受更多请求并执行它们时,什么机制会处理?单个线程如何继续处理其他请求?什么工作,setTimeout而其他请求继续进入并执行.

#2:如果这些setTimeout函数在幕后执行,而有更多请求进入和执行,那么在幕后执行异步执行的是什么?我们谈到的这件事叫EventLoop什么?

#3:但是不应该将整个方法放入,EventLoop以便整个事件被执行并调用回调方法?这是我在谈论回调函数时所理解的:

function downloadFile(filePath, callback)
{
  blah.downloadFile(filePath);
  callback();
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,JS引擎如何知道它是否是异步函数,以便它可以将回调EventLoop? Perhaps something like the放在C#中的async`关键字中,或者某种属性指示JS引擎将采用的方法是异步方法并应相应地对待.

#4:但是一篇文章说的与我猜测事情可能如何起作用完全相反:

Event Loop是一个回调函数队列.执行异步函数时,回调函数将被推入队列.在执行异步函数之后的代码之前,JavaScript引擎不会开始处理事件循环.

#5:这里有这个图像可能会有所帮助,但图像中的第一个解释是说第4个问题中提到的完全相同:

在此输入图像描述

所以我的问题是要对上面列出的项目做一些澄清?

javascript multithreading asynchronous event-loop node.js

126
推荐指数
3
解决办法
5万
查看次数

了解javascript中的事件队列和调用堆栈

我对理解"事件队列"和"调用堆栈"概念的好奇心在我解决这个问题时开始:

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        nextListItem();
    }
};
Run Code Online (Sandbox Code Playgroud)

如果数组列表太大,以下递归代码将导致堆栈溢出.你如何解决这个问题仍然保留递归模式?

提到的解决方案是这样的:

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};
Run Code Online (Sandbox Code Playgroud)

解:

由于事件循环处理递归而不是调用堆栈,因此消除了堆栈溢出.当nextListItem运行时,如果item不为null,则将超时函数(nextListItem)推送到事件队列并退出函数,从而使调用堆栈保持清零.当事件队列运行其超时事件时,将处理下一个项目并设置计时器以再次调用nextListItem.因此,在没有直接递归调用的情况下从开始到结束处理该方法,因此无论迭代次数如何,调用栈都保持清晰.

现在我的问题:

Q1)"事件队列"和"调用堆栈"之间有什么区别

Q2)我不明白答案.有人可以详细解释我吗?

Q3)当我在javascript中执行函数或调用变量或对象时.流程怎么样? 什么在调用堆栈?(比方说我做setTimeout ..它是去callstack还是事件队列?)

这些概念非常不清楚.我用谷歌搜索,但大多数结果不是我期望理解的.

请帮忙!

javascript recursion

4
推荐指数
1
解决办法
1183
查看次数