微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个并行AJAX引发的业务思考?

事件的起因是:避免后台执行过慢影响页面显示效果

这是fastcgi_finish_request()使用的简单实例:
假如前台ajax执行的url方法是schedule()……

public function schedule(){

        echo '我回调了噢';
        fastcgi_finish_request();

        echo '我在不断执行,只是你看不见!';
        //处理大量的数据和接口回调
        for(){
            *****
        }
        //处理大量的数据和接口回调
        file_put_contents($文件名,$传入参数);   //后面会提到
}

一个需求又来了,这次是要在执行完第一个ajax后再不断执行一个ajax去查询前面文件中所保存的数据,并返回显示前台已进度条的形式展示

  • 简单概括:要有个不断执行的ajax以表示进度条的数据。
    (1)我首先想到的是前端计时器去不断访问后台的接口,并在数据到一个为”END”的值的时候就结束计时器。
    • 但是这个方案实现起来并不是那么靠谱,因为ajax回调的时间和计数器每次的循环时间是很难统一的。
    • 一个很严重的问题就是,前端是不能同时执行多个ajax的,也就是说,你要执行下一个ajax的之前必须让前一个ajax完全执行后才能开始执行
      这是在内部执行的ajax
function good(){
     $.ajax({
            type:"post",data:{},async:true,url:"**我是不断访问后台文件的接口**",success:function(data){
                    console.log(data);
            }         
    })
}


   $.ajax({
            type:"post",url:"**我是访问大量数据,并把数据存数据存到文件中的接口**",beforeSend: function() {
                console.log("最开始的执行!");
                time=setInterval(good,1000);
            },success:function(data){
                console.log(data);
                console.log("执行成功!");
            },
                complete:function(){
// clearInterval(time);
                console.log("执行结束!");
            },})

这是在前一个大的接口回调后执行的(后台接口含有fastcgi_finish_request()的函数)后,再执行计时器

$.ajax({
            type:"post",data:{
            },url:"**我是很多数据的接口**",success:function(data){
                //我会立即回调,因为后台执行了fastcgi_finish_request
                console.log(data);
            }
        });
    var time=setInterval(function(){
          $.ajax({
            type:"post",url:"**我是不断访问**",beforeSend: function() {
                console.log("最开始的执行!");
            },success:function(data){
                console.log(data);
                 if(data==**){
                  clearInterval(time);
                }
                console.log("执行成功!");
            },
                complete:function(){

                console.log("执行结束!");
            },})
    },1000);

(2)第二个方案原理是使用递归,每次都只执行一次的ajax,并且,每次回调之后都会执行自身

function ajax(){
        console.log("我在不断执行");
        $.ajax({
            type:"post",url:"**这是我不断访问后台文件得到数据的接口**",success:function(data){
                console.log(data);

                ajax();   //我又回去执行自己

                //利用读取的后台数据处理进度条事件

            }
        });
    }

最后我使用第二种办法,成功解决了进度条所产生的不断访问后台数据,而又不会卡死页面效果还有一个值得一提:把不断变化的值放到文件中,读取并写入文件,可以更好的处理前后台数据的传递。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐