我在 ajax 调用方面遇到问题。 我设置了一些代码,每 2 秒运行一个函数,它会使用 WordPress ajax 查看内容是否已更新,对 php 进行一些处理,然后更新数据库:
window.setInterval( "updateContent()", 2000 );
function updateContent(){
if($('#needcontent').hasClass('yes')){
CONTENT.updateContent( 'monitor' , ids );
}
}
$(function() {
CONTENT= {
updateContent: function(callback, data){
data = {
action: 'myplugin_do_ajax',
callback: callback,
data: data
};
$.post(ajaxurl, data, function(response){
switch(data.callback){
case 'monitor' :
data_returned = eval("(" + response + ")");
if(data_returned.completed == 'true'){
//Adjust the DOM because there was a content update, and remove the class "yes" from #needcontent to stop the check until next time
}
else{
//Do nothing because no content was found, let the Interval run again
}
break;
}
}
}
}
我发现的问题是,有时内容非常大,最终会在 php 更新数据库时锁定表。 ajax 调用运行一次,遇到数据库锁定,并且在数据库再次解锁之前不会返回任何内容。数据库可能被锁定 10 秒,导致 1 次运行调用和 4 次未运行调用。
更新: 不是数据库锁定,而是php函数返回时间超过2秒,导致Interval一次又一次循环没有响应。
发生的情况是,这 4 个未运行的 ajax 调用然后开始一个接一个地触发,就像它们试图追赶或其他什么一样。
我尝试将间隔时间增加到 10 秒,但这并不能解决问题,因为如果数据库锁定 11 秒,它仍然会触发两次。
我尝试过在 Javascript 中使用全局变量(恶心)来阻止 Interval 调用该函数,但这似乎也不起作用。
更新 2: 我在下面回答了我自己的问题,看看什么对我有用。
最佳答案
试试这个:
window.updateCheck= window.setInterval( "updateContent()", 2000 );
function updateContent(){
if($('#needcontent').hasClass('yes')){
CONTENT.updateContent( 'monitor' , ids );
clearInterval(window.updateCheck);
}
}
$(function() {
CONTENT= {
updateContent: function(callback, data){
data = {
action: 'myplugin_do_ajax',
callback: callback,
data: data
};
if(window.ajaxCall) window.ajaxCall.abort();
window.ajaxCall= $.post(ajaxurl, data, function(response){
window.updateCheck= window.setInterval( "updateContent()", 2000 );
switch(data.callback){
case 'monitor' :
data_returned = eval("(" + response + ")");
if(data_returned.completed == 'true'){
//Adjust the DOM because there was a content update, and remove the class "yes" from #needcontent to stop the check until next time
}
else{
//Do nothing because no content was found, let the Interval run again
}
break;
}
}
}
}
我们在这里所做的是将间隔放入全局变量中,以及ajax调用(实际上是$.post()调用),然后当检查更新条件时,我们停止间隔,杀死所有其他间隔事件或排队请求并将 ajax 请求发送到服务器。
当请求发送到服务器时,更新检查会停止,一旦服务器响应请求,我们就会再次开始更新检查!
关于php - 数据库解锁后 ajax 多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076547/