Javascript 使用ajax长轮询从外部API更新页面上的响应

Javascript 使用ajax长轮询从外部API更新页面上的响应,javascript,php,jquery,ajax,long-polling,Javascript,Php,Jquery,Ajax,Long Polling,我有以下ajax长轮询脚本 (function poll(){ $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn'); ?>", success: function(data){ //Update your dashboard gauge console.log(data.status); //Data is getting logged if(data.sta

我有以下ajax长轮询脚本

(function poll(){
    $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn');  ?>", success: function(data){
        //Update your dashboard gauge
        console.log(data.status);  //Data is getting logged
        if(data.status == 'success'){  //This condition is not being checked
            console.log('suucesful'); //Not coming
        }
    }, dataType: "json", complete: poll, timeout: 1000 });
})();
流量

  • 当我呈现页面时,ajax脚本运行并等待响应。当我检查网络选项卡时,ajax无休止地向指定的URL发出请求

  • 我从一个外部网站得到一个表单帖子,它被发送到后端PHP,我需要将其推送到jquery

  • 但是当post发生时,控制台中没有任何记录。但是如果我在$json中硬编码一些值并对其进行响应,它就会出现在控制台中

    我面临两个问题

  • 当在PHP脚本上发生post时,它不会出现在ajax代码中

  • 当我硬编码(模拟外部表单post发布的响应)并回显$json时,它会出现在控制台中,但是数据的条件。状态=='success'不会被检查

  • 这有什么不对。我错过什么了吗

    更新


    如果使用长轮询,可能会出现缓存问题。 首先,当你的帖子到达你的系统时,检查checkTxn是否改变。 最后,您可以在url查询中添加一个随机参数(例如,通过添加以毫秒为单位的日期),您不会使用它,但您的服务器会认为您的请求不同

    请检查一下,让我们知道

    @编辑:当然@Ajeesh,我会解释一下:

    (function poll(){
        $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn');  ?>?_ts=" + new Date().getTime(), success: function(data){
            //Update your dashboard gauge
            console.log(data.status);  //Data is getting logged
            if(data.status == 'success'){  //This condition is not being checked
                console.log('suucesful'); //Not coming
            }
        }, dataType: "json", complete: poll, timeout: 1000 });
    })();
    
    (函数轮询(){
    $.ajax({url:?\ts=“+new Date().getTime(),success:function(data){
    //更新你的仪表盘仪表
    console.log(data.status);//正在记录数据
    如果(data.status=='success'){//,则未检查此条件
    console.log('suucesful');//不来
    }
    },数据类型:“json”,完成:轮询,超时:1000});
    })();
    
    这样,缓存就不会被使用,因为服务器/浏览器的所有查询都是不同的


    另一方面,当您收到帖子时,我会要求您对页面进行任何更改,因此,如果没有,您的ajax将永远不会收到通知,您知道我的意思吗?

    如果您使用长轮询,可能会出现缓存问题。 首先,当你的帖子到达你的系统时,检查checkTxn是否改变。 最后,您可以在url查询中添加一个随机参数(例如,通过添加以毫秒为单位的日期),您不会使用它,但您的服务器会认为您的请求不同

    请检查一下,让我们知道

    @编辑:当然@Ajeesh,我会解释一下:

    (function poll(){
        $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn');  ?>?_ts=" + new Date().getTime(), success: function(data){
            //Update your dashboard gauge
            console.log(data.status);  //Data is getting logged
            if(data.status == 'success'){  //This condition is not being checked
                console.log('suucesful'); //Not coming
            }
        }, dataType: "json", complete: poll, timeout: 1000 });
    })();
    
    (函数轮询(){
    $.ajax({url:?\ts=“+new Date().getTime(),success:function(data){
    //更新你的仪表盘仪表
    console.log(data.status);//正在记录数据
    如果(data.status=='success'){//,则未检查此条件
    console.log('suucesful');//不来
    }
    },数据类型:“json”,完成:轮询,超时:1000});
    })();
    
    这样,缓存就不会被使用,因为服务器/浏览器的所有查询都是不同的


    另一方面,我要求您在收到帖子时对页面进行任何更改,因此,如果没有,您的ajax将永远不会收到通知,您知道我的意思吗?

    1。让我们调试一下:

    设置ajax错误回调

    $(function(){
    
            (function poll(){
                $.ajax({ url: "http://tinyissue.localhost.com/test.php", success: function(data){
                    //Update your dashboard gauge
                    console.log(data.status);  //Data is getting logged
                    if(data.status == 'success'){  //This condition is not being checked
                        console.log('suucesful'); //Not coming
                    }
                },error:function(err){
                    console.info('error fired...');
                    console.info(err);
                }, dataType: "json", complete: poll, timeout: 1000 });
            })();
    
        });
    
    运行此命令,您将获得控制台

    error fired...
    Object {readyState: 4, responseText: "", status: 200, statusText: "OK"}
    
    2。为什么转到错误回调:

    为什么ajax响应
    status
    200
    statusText
    “OK”
    错误
    回调仍然被触发,而不是
    成功

    您的AJAX请求包含以下设置:

    dataType: "json"
    
    声明jQuery:

    将响应计算为JSON并返回一个JavaScript对象。(...) JSON数据被严格解析;任何格式错误的JSON都是 拒绝,并引发分析错误

    这意味着,如果服务器返回状态为200OK无效JSON,那么jQuery将启动错误函数并将textStatus参数设置为“parsererror”

    解决方案:确保服务器返回有效的JSON。值得注意的是,空响应也被认为是无效的JSON;例如,您可以返回{}或null,验证为JSON

    3。为什么ajax返回无效的JSON:

    在您看来,在服务器端,您检查了
    $\u POST['status']
    以确保循环轮询中的最后一次调用成功,只有设置了
    $\u POST['status']
    ,您才会回显json,否则它不会回显任何内容

    但是,不幸的是,在调用循环的开始,第一次调用ajax时,您没有将
    状态设置为post。然后它什么也不回显,然后它进行
    错误
    回调,也进行
    完成
    回调,然后在没有
    状态
    的情况下再次调用以发布。看,这是一个糟糕的循环

    4。解决方案:

    设置一个
    status
    值,以便在第一次ajax调用时发布

    $(function(){
    
            (function poll(){
                var status = 'success';
                $.ajax({ url: "http://tinyissue.localhost.com/test.php", success: function(data){
                    //Update your dashboard gauge
                    console.log(data.status);  //Data is getting logged
                    status = data.status;
                    if(data.status == 'success'){  //This condition is not being checked
                        console.log('suucesful'); //Not coming
                    }
                },error:function(err){
                    console.info('error fired...');
                    console.info(err);
                    status = 'error';
                }, type:'post',dataType: "json", data:{status:status}, complete: poll, timeout: 1000 });
            })();
    
        });
    

    1。让我们调试一下:

    设置ajax错误回调

    $(function(){
    
            (function poll(){
                $.ajax({ url: "http://tinyissue.localhost.com/test.php", success: function(data){
                    //Update your dashboard gauge
                    console.log(data.status);  //Data is getting logged
                    if(data.status == 'success'){  //This condition is not being checked
                        console.log('suucesful'); //Not coming
                    }
                },error:function(err){
                    console.info('error fired...');
                    console.info(err);
                }, dataType: "json", complete: poll, timeout: 1000 });
            })();
    
        });
    
    运行此命令,您将获得控制台

    error fired...
    Object {readyState: 4, responseText: "", status: 200, statusText: "OK"}
    
    2。为什么转到错误回调:

    为什么ajax响应
    status
    200
    statusText
    “OK”
    错误
    回调仍然被触发,而不是
    成功

    您的AJAX请求包含以下设置:

    dataType: "json"
    
    声明jQuery:

    将响应计算为JSON并返回一个JavaScript对象。(...) JSON数据被严格解析;任何格式错误的JSON都是 拒绝,并引发分析错误

    这意味着,如果服务器返回状态为200OK无效JSON,那么jQuery将启动错误函数并将textStatus参数设置为“parsererror”

    解决方案:确保服务器返回有效的JSON。值得注意的是