php - 数据库解锁后 ajax 多次触发

标签 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 中使用全局变量(恶心)来阻止 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/

相关文章:

javascript - php js 处理事件开始日期和结束日期

php - $_POST 在 AJAX 调用的页面中不起作用

php - 更新具有最大值的行

javascript - 一键获取模态图像

php - Twilio 15 秒请求限制

javascript - 如何在 Javascript 中将常规日期转换为 unixtime?

mysql - 与 'waiting for initial communication packet' 处的 MySQL 服务器失去连接

phpmyadmin 显示完整的 sql 输出

php - 嵌套数组/连接可以用 Php::PDO 完成吗?

javascript - Twitter 嵌入(使用 wordpress)并加载?