【问题标题】:How does Javascript handle obsolete callbacksJavascript 如何处理过时的回调
【发布时间】:2020-10-06 12:32:17
【问题描述】:

我正在尝试理解 Node JS 中的事件循环。网上有很棒的资源,但我一直在想同样的事情。场景如下:

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

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

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

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

非常感谢!

【问题讨论】:

标签: javascript node.js event-loop


【解决方案1】:

很确定浏览器会丢弃响应,因为请求本身已关闭。这取决于时间,服务器(忘记它是 node.js 还是 apache 或其他任何东西)可能仍会及时获得响应以尝试响应它。如果它确实响应它,它并不关心浏览器对响应做了什么。

你说

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

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

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

调用堆栈没有移动,服务器收到一个请求,只要该请求打开,服务器就应该响应它。如果另一个请求进入(即使新请求几乎相同),服务器也会单独响应该请求。

【讨论】:

    【解决方案2】:

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

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

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

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

    然后回调退出,堆栈帧从堆栈中弹出,分配给堆栈帧的内存被释放,控制返回到前一帧。当 Node.js JavaScript 运行时中的垃圾收集器下一次运行时,任何单独链接到该不再存在的框架的对象都会被清除,并释放与它们相关的内存。

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

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

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

    我认为。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2016-01-06
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多