2010-08-18 38 views
0

我读了很多问题,但他们不适合我的情况。 我的情况是:我的ajax查询到数据库插入信息。但在我的网络应用程序中,用户可以非常快速地点击按钮,因此以前的ajax查询没有完成,并且出现了错误。 我需要做的只是查询之间的延迟,所以以后的查询只能在完成之前完成。 下面是一个代码:如何推迟ajax查询?

$('#save').click(function(){ 

    var user_input=$('#user').val(); 
    var section=$('#section').val(); 

    $('#loading_info').append('<p><img src="Images/loading.gif" alt="loading" id="loading"/></p>'); 
    $.ajax({ 
     url: 'submit_db.php', 
     type: 'POST', 
     data: 'section='+section+'&user_input='+user_input, 
     success: function(result){ 
      $('#response').remove(); 
      $('#loading_info').append('<p id="response">' + result + '</p>'); 
      $('#loading').fadeOut(500, function(){ 
       $(this).remove(); 
      }); 
     } 
    }); 
    return false; 
}); 

我测试,不工作:插入超时:3000到AJAX - 1个查询是好的,但在此之后,整个应用程序冻结;使用ajaxSetup()设置超时 - 相同的情况。经过测试的setInterval函数,并将Ajax查询 - 但它后没有Ajax,应用程序打开一个实施的PHP文件并冻结。

这不工作:

$('#save').click(function(){ 
    var t=setTimeout(function(){ 
    var user_input=$('#user').val(); 
    var section=$('#section').val(); 

    $('#loading_info').append('<p><img src="Images/loading.gif" alt="loading" id="loading"/></p>'); 
    $.ajax({ 
     url: 'submit_db.php', 
     type: 'POST', 
     data: 'section='+section+'&user_input='+user_input, 
     success: function(result){ 
      $('#response').remove(); 
      $('#loading_info').append('<p id="response">' + result + '</p>'); 
      $('#loading').fadeOut(500, function(){ 
       $(this).remove(); 
      }); 
     } 
    }); 
    return false;    
    },3000); 

}); 

,这是不是工作压力太大:

$('#save').click(function(){ 

    var user_input=$('#user').val(); 
    var section=$('#section').val(); 

    $('#loading_info').append('<p><img src="Images/loading.gif" alt="loading" id="loading"/></p>'); 
    $.ajax({ 
     url: 'submit_db.php', 
     type: 'POST', 
     timeout: 3000, 
     data: 'section='+section+'&user_input='+user_input, 
     success: function(result){ 
      $('#response').remove(); 
      $('#loading_info').append('<p id="response">' + result + '</p>'); 
      $('#loading').fadeOut(500, function(){ 
       $(this).remove(); 
      }); 
     } 
    }); 
    return false; 
}); 

最后,这是不是太工作:提前

$.ajaxSetup({ 
    timeout:3000, 
}); 

谢谢

+0

看到这个delay_method,它允许你给执行队列标签http://stackoverflow.com/a/30503848/1834212 – Miguel 2015-05-29 16:00:40

回答

2

我建议创建一个布尔值并禁用任何按钮。

创建一个名为“buttonPressed”的布尔值,将其设置为false。提交时,如果“buttonPressed”设置为false,则检入代码。如果未设置为false,请跳过AJAX请求,否则将buttonPressed设置为true并执行AJAX请求。请求完成后,将buttonPressed设置为false,并允许新按钮按下。

+0

哇 - 感谢的人 – dsplatonov 2010-08-18 10:09:08

+0

np。很高兴我能帮上忙 :) – 2010-08-18 10:35:13

0

使用一个sentinel变量,以便一次只能发生一个请求。如果用户能够发出多个请求,然后为请求实现一个队列是合理的,那么在处理先前的请求之后,处理队列中下一个元素的调用发生在那里。

1

问题可以这样说:用户在第二次点击3次,并且在3秒钟内超时,三次查询并在一秒钟内发送。

使用setTimeout,但每次用户点击时清除此超时值,因此每次用户点击时,计时器都会重置,您不必担心查询“队列”。

其他的解决方法是检测不定时工作,并在3000创造价值的新TIMET实际定时器+休息时间忽略或队列用户点击(队列

1

保罗Peelen的答案可能是你最好的一个,但另一个安全的解决方案是排列你的请求,它将允许你的代码异步执行,但仍然按顺序甚至(潜在地)允许你在离开机器之前杀死重复的请求。像这样:

  1. 创建一个数组来保存您的请求
  2. 当用户的操作导致请求时,将其放入队列的末尾。
  3. 立即调用队列处理器。如果之前的请求尚未产生响应,则不要执行任何操作 - 只需将其保留在队列中即可。否则,从队列中移除第一项并处理它。此时,您还可以查看其他排队的请求并删除重复项,或将高优先级请求推送到队列顶部。
  4. 收到响应后,将它发送到需要去的任何地方,并告诉队列处理器处理下一个请求。

这其实很简单,我确信有更好的变化。如果服务器稳定性是一个可能的问题,你应该建立某种程序来杀死死亡请求(僵尸)。