【问题标题】:Javascript ajax request callback without waiting for responseJavascript ajax 请求回调,无需等待响应
【发布时间】:2021-06-16 20:38:59
【问题描述】:

我知道我们可以从某个服务器发出 javascript ajax 请求,它要么收到响应,要么在一段时间后给出超时错误。

让我们考虑这种情况,当我们不想等待请求,而是服务器会在收到请求后随时异步发送响应(或者我们可以说这将是从服务器到客户端的另一个请求),然后使用响应调用 javascript CB 函数。

我正在寻找如何实现它的想法,主要支持所有现代浏览器,如果可能的话,不依赖任何第三方插件,除了可能是 jQuery。

【问题讨论】:

  • 所以您希望服务器按照服务器条款向客户端发送信号?或者特别是在客户发送帖子/获取之后?
  • 看看网络套接字,网络套接字协议将使您能够在客户端->服务器、服务器->客户端的任一方向上传输数据。看看socket.io 一个库,它使用套接字或其他可用技术实现客户端和服务器之间的实时通信。
  • 您可以在服务器开始处理,向用户返回请求在队列中的响应。服务器在一段时间后完成请求并将结果推送到客户端。这是一种推送机制,可以使用 websockets、长轮询(在旧浏览器中)来实现,或者您可以使用 socket.io 等库
  • @Glubus 服务端收到请求,但不推送同一个请求响应的处理结果。 SatishGadhave:这个推送机制就是我要找的,希望能找到一些原生的实现。

标签: javascript jquery ajax


【解决方案1】:

Ajax 的主要特点是它默认是异步的,你的程序会继续运行而不等待响应。因此,除非我误读了您的问题,否则这就是您所需要的。

如果您使用 jquery,那么您将传入一个回调函数,该函数仅在服务器发回响应时才会执行。您可以在设置中指定超时,但我不确定您可以提供的最长时间不会出现超时错误。但这至少需要几秒钟。

您甚至可以为成功和失败指定不同的回调,如下所示(改编自 jquery ajax API,但添加了 5 秒的超时):

var request = $.ajax({
  url: "http://www.some.url/",
  method: "GET",
  data: { some : stuff },
  dataType: "html",
  timeout: 5000
});

request.done(function( data ) {
  console.log( "SUCCESS: " + data );
});

request.fail(function() {
  console.log( "Request failed");
});

【讨论】:

    【解决方案2】:

    4 年后我遇到了这个问题。我不记得我是在什么情况下问这个的,但对于任何有相同查询的人:

    Http 是一个请求/响应协议。这意味着客户端发送一个请求,服务器用一些消息/数据响应该请求。该请求的故事到此结束。

    为了让服务器在客户端触发某些东西,我们必须使用一些东西来保持与服务器的连接,而不是在收到响应后结束通信。 Socket.io 是解决这个问题的双向事件驱动库。

    【讨论】:

      【解决方案3】:

      要在我的网上商店更新购物车(PHP 会话存储并保留数据库中的商品库存),我只需在调用它后添加 100 毫秒超时删除成功/错误回调

      $.ajax({
        url: 'http://www.some.url/',
        method: 'GET',
        data: {
          some : 'stuff' 
        },
        dataType: 'html',
        timeout: 100
      });
      

      注意:如果某些请求没有到达并不重要,因为当保存订单时,会通过回调发送整个购物车的更新。 如果您的查询需要确认,请不要使用该解决方案!

      【讨论】:

        【解决方案4】:

        我相信您的问题类似于this 保罗·汤布林。我使用gdoron提供的答案,也被标记为最佳解决方案,以及AS7K的评论。

        $.ajax({
            url: "theURL",
            data: theData
        });
        

        注意:未提供 async 参数。

        【讨论】:

        • 别人的答案不能作为自己的答案。如果您有自己的答案,请将其作为新答案,否则只需将链接分享为评论。
        • 是的。我完全按照您发布的那样做,即引用作者并提供链接。好吧,我相信您应该发布应该如何做,因为我们中的许多人都不熟悉该平台的一些不成文规则。
        猜你喜欢
        • 2014-04-24
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多