数据库解锁后多次激活ajax

时间:2014-09-27 16:07:33

标签: php jquery mysql ajax

我遇到了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: 我在下面回答了我自己的问题,对我有用。

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;