【问题标题】:Are ajax requests guaranteed to hit the server in order?ajax 请求是否保证按顺序访问服务器?
【发布时间】:2015-07-09 03:44:05
【问题描述】:

来自the docs

Ajax 中的第一个字母代表“异步”,意思是操作并行发生,完成顺序没有保证。

我将此解释为您的 then/done/always/fail 回调不能保证按照请求发出的顺序触发。如果您正在调用不同的 API 端点并且其中一些端点比其他端点花费更长的时间,那么这是有道理的。

我想知道的是,如果您向同一个 API 端点发出 ajax 请求,它们是否保证按顺序到达服务器?

我编写了一些代码,可以在您键入时自动保存草稿,我想知道是否可以保证始终保存草稿的最新副本,或者是否有可能会收到较旧的 ajax 请求在较新的草稿之后,然后我的 PHP 代码将导致较新的草稿被较旧的草稿覆盖。请求返回的顺序无关紧要;只是他们收到的顺序很重要。

我可以想办法解决这个问题,我只是想知道是否有必要。

【问题讨论】:

    标签: php jquery ajax nginx


    【解决方案1】:

    请求可以按相关网络决定传递数据包的任何顺序到达。

    例如

    在时间点 0.000 的请求 #1 采用路线 A
    在时间点 0.123 的请求 #2 采用路线 B

    但突然,反铲挖土机切断了处理路径 A 的光缆,导致网络重新路由通过使用 RFC 1149 载波的路径 C,导致到达延迟 12 小时。所以在服务器上,你最终会得到

    请求 #2 到达时间点 0.173,采用了一条不错的“慢”50ms 路线
    请求 #1 在时间点 12:00:00:0.50 到达,走了更长的路线。

    【讨论】:

    • 如果请求是在单独的 TCP 连接上发出的,则不能保证它们的顺序;但是如果它们是通过相同的连接发送的(这在 HTTP 2.0 中是可能的),那么它们的顺序将由底层 TCP 流来保证。与往常一样,浏览器是否支持 HTTP 2.0,以及它如何具体处理 AJAX 请求都是一个废话;但服务器也必须支持 HTTP 2.0。
    【解决方案2】:

    与任何异步操作一样,答案是自信的“也许!”

    仅仅因为你的 JavaScript 引擎以特定的顺序触发了一系列回调并不意味着服务器会以相同的顺序接收它们,尤其不意味着它们会以相同的顺序结束。

    如果其中一个请求由于数据包丢失而停止,被负载平衡器阻止,或者由于各种原因导致延迟,它就会失去顺序。由于这些事件并不少见,因此最安全的赌注是它们将按随机顺序发布并按随机顺序完成。

    如果您需要它们按顺序发生,则必须等待其中一个完成才能触发下一个。

    【讨论】:

    • 我一直陪着你直到最后。我认为我不必等待一个完成才能触发下一个。我只需要在 ajax 请求上附加一个顺序计数器,然后在服务器上删除任何低于迄今为止收到的最大数量的计数器。可能监视整数溢出。但是,如果我每 500 毫秒触发一次,那么在 32 位签名 int 上为我买了 34 年。
    • @mark 哦,如果您可以将 API 更改为具有序列标识符,绝对可以。我只是在谈论使用您无法控制的通用 API 进行一般理论的排序。如果您有能力忽略无序请求,new Date().getTime() 值将在您相当频繁但不激进地发送调用时起作用,或者在其他情况下随机 31 位整数与客户端会话标识符相结合。
    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2023-01-27
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多