Javascript如何处理过时的回调

问题描述

我试图了解Node JS中的事件循环。在线上有很棒的资源,但我不断发现自己在想同样的事情。情况如下:

对于Javascript /节点 在带有getData按钮的网页上。 用户单击按钮,然后将请求发送到服务器的getData路由(在此简化方案中,当服务器获取数据时,它将返回一个显示数据的新页面)。数据请求被异步卸载到Node API(并从调用堆栈中卸载)。 在api返回用户在浏览器中更改页面的数据之前,新的http请求已发送到服务器以获取其他页面,这会触发http.get(url,callback)将新页面添加到要加载的回调队列中(这击败了数据请求并返回了新页面)。

对于现在的冗余数据,旧的回调会发生什么?大概在事件循环到达cb队列中的getData回调时,它将尝试运行该回调函数。 Node是否会发送响应以再次与数据显示页面一起更改页面?如果是Ajax,并且页面更改后返回的数据在这种情况下回调发生了什么,那么ajax是否会忽略新页面上返回的数据?

我知道Ajax可以处理页面更新,但是我想简化一下,以了解事件循环如何处理调用堆栈已经移动并且较旧的回调不再有用的情况。

感谢您的回复,它们非常有用!我要添加的唯一一件事是(并且我理解这种情况需要非常糟糕的服务器设计,但我的理论是我的兴趣),如果服务器确实响应了用户不再需要的页面(由于异步延迟)响应),浏览器是否了解这不是最新请求?我认为由于http是无状态的,因此浏览器将通过TCP接收响应并重新加载以前请求的页面(使客户端感到沮丧)。

非常感谢!

解决方法

在简化的HTTP请求方案中,首先使用TCP在客户端(例如Web浏览器)和服务器之间建立连接。

通过此链接发送HTTP,以配置数据交换。

TCP连接一直保持到任一端关闭为止(通常客户端说“谢谢!全部完成!”)。因此,当Node.js进程异步获取一些数据时,TCP连接保持打开状态。

如果用户放弃等待响应,并且(例如)关闭浏览器,则TCP连接将在两端均关闭。同时,数据库调用的回调将继续存在于服务器内存中,以备DB返回时使用。然后,数据库返回,运行回调,并且一旦回调尝试通过TCP连接将数据发送回客户端,它将发现它已关闭,并且将在服务器上引发(并可能捕获)适当的错误。 -侧。

然后退出回调,从堆栈弹出堆栈框架,释放分配给堆栈框架的内存,然后控制权返回到上一个框架。当下一次运行Node.js JavaScript运行时中的垃圾收集器时,所有仅链接到该不再存在框架的对象都将被清除,并释放与它们关联的内存。

在路径不愉快的情况下(例如,拔下客户端计算机上的电源插头),服务器将认为TCP连接在可配置的时间内仍处于打开状态,直到超时或发现无法成功进行连接通过它发送数据,然后服务器将其关闭并清理关联的内存。

HTTP keep-alive的概念可能会使情况变得复杂,该概念涉及浏览器和服务器同意对多个HTTP请求使用单个TCP连接来节省时间。在HTTP保持活动状态下,利用HTTP协议来确保浏览器将安全地忽略通过TCP连接返回的与不再活动的请求相对应的任何数据。

还有一种更现代的技术,也可以在同一TCP连接上多路复用多个并发的HTTP请求,但这不在此问题的范围内。

我想。

,

由于请求本身已关闭,因此可以确定浏览器会丢弃响应。这取决于时间,服务器(忘记它是node.js还是apache或其他任何东西)可能仍会及时获得响应以尝试对其进行响应。如果确实有响应,则不在乎浏览器如何处理响应。

你说

用户单击按钮,然后将请求发送到服务器的getData路由(在此简化方案中,当服务器获取数据时,它将返回一个显示数据的新页面)。数据请求被异步卸载到Node API(并从调用堆栈中卸载)

浏览器忽略了服务器的实现。只要服务器尝试响应,它都不关心服务器如何响应。同时,服务器也忽略了浏览器的“状态”。服务器只知道有一个打开的请求需要它来响应并这样做。一旦响应,就不管了。

我知道Ajax可以处理页面更新,但是我想简化一下,以了解事件循环如何处理调用堆栈已经移动并且较旧的回调不再有用的情况。

调用栈没有移动,服务器接收到一个请求,只要该请求是打开的,服务器就应该对其进行响应。如果出现另一个请求(即使新请求几乎相同),服务器也会分别响应该请求。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...