我遇到了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(yuck)中使用全局变量来阻止Interval调用函数,但这似乎也不起作用。
更新2: 我在下面回答了我自己的问题,对我有用。
答案 0 :(得分:0)
试试这个:
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请求发送到服务器。
当请求被发送到服务器时,更新检查被停止,然后一旦服务器响应请求,我们就再次开始更新检查!
答案 1 :(得分:0)
charlietfl对我的OP的评论让我想到了setInterval和setTimeout之间的区别,我意识到:
a)无论是否返回结果,setInterval都会连续运行。在我的例子中,使用ajax,函数被异步调用,因此setInterval不关心是否返回了结果。
b)如果我将代码更改为使用setTimeout,我可以更多地控制结果。
这就是我所做的。
首先,完全删除setInterval函数,不需要它。
然后我把我的开关盒更改为:
case 'monitor' :
var monitor = false;
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{
//Run the monitor after a 2 second timeout.
var ids = j('.contentDiv').attr('id');
window.setTimeout(CONTENT.updateContent( 'monitor' , ids ) , 2000);
}
break;