【问题标题】:How to handle slow response of ajax on div sharing by multiple function如何处理ajax对多个功能共享div响应慢的问题
【发布时间】:2015-09-01 14:33:24
【问题描述】:

我有一个 div。

<div id="test"></div>

功能少。

fun1()
{
  $('#test').html('');
  $.ajax(function(){
     url : abc/index;
     success : function(response){
      $('#test').html(response);
     }
  });
}
fun2()
{
     $('#test').html('');
     $.ajax(function(){
     url : abc/getDetail;
     success : function(response){
      $('#test').html(response);
     }
  });
}
fun3()
{
 $('#test').html('');
  $.ajax(function(){
     url : abc/getUser;
     success : function(response){
      $('#test').html(response);
     }
  });
}

函数在不同的按钮点击时调用。

btn1.click(fun1())
btn2.click(fun2())
btn3.click(fun3())

当 btn1、btn2、btn3 一个接一个地按下时,我可以看到 div 'test' 包含作为第一个 'fun1' 响应,经过一段时间的 'fun2' 响应等等。

我知道原因,因为我的 ajax 响应非常慢,这就是它发生的原因。

当有人点击 btn1 并且在得到 fun1 的响应之前,按 btn2。在这种情况下,我只想加载 fun2 响应。如果 fun2 正在延迟想要显示空白页。

我正在考虑在按下按钮时终止剩余的 ajax 请求。但同时我的其他 ajax 请求也在进行,我不想杀死那些。 所以杀死其他ajax请求对我不起作用。 其他解决方案是什么。

【问题讨论】:

  • 那么问题是缓慢的 ajax 请求还是这些似乎都将数据填充到同一个元素中的不同按钮之间的交互?
  • @Mike Brant : 缓慢的 ajax 响应。
  • 好吧,您甚至还没有在这里谈论过。为什么反应慢?反应太大了吗?后端服务器提供响应的速度是否太慢(即代码可能写得不好,数据库访问速度很慢等)。但是,如果您真的想了解如何提高响应速度,则需要详细说明时间花在哪里。
  • @Mike Brant:服务器响应很慢。
  • @HemantMalpole 好的。但为什么?您是否在服务器端进行了任何分析/计时以了解代码将时间花在哪里?就目前而言,这个问题太宽泛了。您甚至还没有回答基本问题,例如响应负载的大小。如果你有一个巨大的响应,也许你所有的时间都花在了下载响应上。

标签: javascript jquery ajax


【解决方案1】:

好的,你有两个问题

1:当您真的只想处理最后一个请求时,您正在触发多个请求

2:无论发生了什么,每个事件都会更新屏幕

我建议你分别解决这两个问题。

首先,为您的响应添加一个回调函数。这将允许您在更新页面之前检查条件(例如“还有其他事情发生吗?”)。这使您有机会将第一个响应扔出去。

其次,您需要首先处理多个请求的发送。您可以在单击第二个按钮时取消它们,(但它们仍将在服务器上处理)或者:您可以添加一个计时器而不立即发送请求。

单击按钮时启动计时器,然后说 200 毫秒?稍后,触发请求并处理响应。

如果您在 200 毫秒内再次点击,请忘记第一个计时器并开始一个新计时器。

或者,您可以通过停用按钮并仅在收到响应后重新激活来阻止用户在发送请求后单击按钮。

例如:(我知道的全局变量有点粗糙)

    var btnLastPressed =0
    fun1()
    {
      btnLastPressed = 1;
      $('#test').html('');
      $.ajax(function(){
         url : abc/index;
         success : function(response) { finished(1,response);}
      });
    }

    function finished(btn, response){
       if(btnLastPressed==1){
          $('#test').html(response);
       }
    }

【讨论】:

  • 问题很简单。一个 div 由多个 ajax 请求共享。理想情况下,最后一个按钮点击响应应该出现在 div 上。一件重要的事情是,并非所有 ajax 都不会花费相同的时间来响应。说 btn1 按。它的响应在 2 秒后出现。同时,当有人按下 btn2 时,它的响应会在 0.5 秒内出现。然后 btn2 响应在 1.5(即 2 - 0.5)秒后出现在 div 上 btn1 响应出现在 div 上。
  • 是的,唯一的复杂性是第三个响应是否依赖于前两个正在处理的响应。即你的ajax请求做++1或有状态的东西
  • 无响应依赖。
  • 我的解决方案应该没问题
  • 你说检查 div 中是否有任何变化作为响应。我不明白这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2015-11-18
  • 2020-09-10
  • 2023-04-03
  • 2017-02-07
  • 2014-01-24
相关资源
最近更新 更多