Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在使用Express应用程序时setTimeout仍然有效?_Javascript_Node.js_Express_Asynchronous_Settimeout - Fatal编程技术网

Javascript 为什么在使用Express应用程序时setTimeout仍然有效?

Javascript 为什么在使用Express应用程序时setTimeout仍然有效?,javascript,node.js,express,asynchronous,settimeout,Javascript,Node.js,Express,Asynchronous,Settimeout,我正在制作一个Express应用程序,我打算使用setTimeout在设定的时间后使第三方API使用的访问令牌无效。我认为它可能不起作用,因为像setTimeout这样的异步函数被推到事件队列上,并且在其他所有操作都运行完之前不会运行。Express应用程序(我假设)总是在运行,因为它总是在侦听请求,所以我认为,由于程序从未完成,setTimeout将永远不会运行。但是setTimeout运行得很好,而且很准时 为什么这仍然是可能的?Express的侦听部分是否有非JS内容,或者我是否误解了as

我正在制作一个Express应用程序,我打算使用setTimeout在设定的时间后使第三方API使用的访问令牌无效。我认为它可能不起作用,因为像setTimeout这样的异步函数被推到事件队列上,并且在其他所有操作都运行完之前不会运行。Express应用程序(我假设)总是在运行,因为它总是在侦听请求,所以我认为,由于程序从未完成,setTimeout将永远不会运行。但是setTimeout运行得很好,而且很准时


为什么这仍然是可能的?Express的侦听部分是否有非JS内容,或者我是否误解了async和事件队列?

Express服务的请求都会像setTimeout()一样通过事件队列,因此它们共享相同的事件队列,可以很好地交叉

因此,当传入请求到达Express服务器时,一些较低级别的TCP代码会将该传入连接插入事件队列。下一次Express完成执行时,nodejs解释器返回事件队列并获取下一个事件。这可能是下一个传入请求,也可能是为请求提供服务的某种中间异步操作(例如数据库查询完成),也可能是您的
setTimeout()

事件通常由FIFO(先进先出)提供,但当队列中有多种不同类型的事件等待运行时,不同类型的事件之间存在一些优先级,可能会影响排序细节

Express应用程序(我假设)总是在运行,因为它总是在侦听请求,所以我认为,由于程序从未完成,setTimeout将永远不会运行。但是setTimeout运行得很好,而且很准时


在本例中,“始终运行”只是意味着它已经准备好并等待传入的请求。每当JS解释器返回到下一个事件的事件循环时,事件队列中的其他东西(如计时器)都可以正常运行。

Express服务的所有请求都会像
setTimeout()
一样通过事件队列,因此它们共享相同的事件队列,并且可以很好地交叉

因此,当传入请求到达Express服务器时,一些较低级别的TCP代码会将该传入连接插入事件队列。下一次Express完成执行时,nodejs解释器返回事件队列并获取下一个事件。这可能是下一个传入请求,也可能是为请求提供服务的某种中间异步操作(例如数据库查询完成),也可能是您的
setTimeout()

事件通常由FIFO(先进先出)提供,但当队列中有多种不同类型的事件等待运行时,不同类型的事件之间存在一些优先级,可能会影响排序细节

Express应用程序(我假设)总是在运行,因为它总是在侦听请求,所以我认为,由于程序从未完成,setTimeout将永远不会运行。但是setTimeout运行得很好,而且很准时


在本例中,“始终运行”只是意味着它已经准备好并等待传入的请求。每当JS解释器返回到下一个事件的事件循环时,事件队列中的其他东西(如计时器)都能够正常运行。

“或者我误解了async和事件队列吗?”-是的。请求来自事件队列。因此,当它侦听请求时,它处于空闲状态,等待请求到达事件队列。如果其他事件先出现,它将处理它们。“或者我误解了async和事件队列了吗?”-是的。请求来自事件队列。因此,当它侦听请求时,它处于空闲状态,等待请求到达事件队列。如果其他事件首先出现,它将处理它们。这是有道理的,请求和计时器都在事件队列中,因此它们不会相互干扰。“准备好并等待传入请求”,这不是编程行为吗,比如while循环之类的?这意味着调用堆栈将永远不会为空,因为等待函数始终在运行,因此事件队列、请求或计时器中的任何内容都不能被拉入?这是我现在不明白的地方。@AdnanZaman-不。Nodejs是一个事件驱动的环境。您不需要在循环中等待传入的网络请求。您只需为传入事件注册一个事件处理程序,传入流量将触发一个事件,该事件将导致您的回调通过事件循环被调用。这很有意义,请求和计时器都位于事件队列中,因此它们不会相互干扰。“准备好并等待传入请求”,这不是编程行为吗,比如while循环之类的?这意味着调用堆栈将永远不会为空,因为等待函数始终在运行,因此事件队列、请求或计时器中的任何内容都不能被拉入?这是我现在不明白的地方。@AdnanZaman-不。Nodejs是一个事件驱动的环境。您不需要在循环中等待传入的网络请求。您只需为传入事件注册一个事件处理程序,传入流量将触发一个事件,该事件将导致您的回调通过事件循环被调用。