首页新闻找找看学习计划

asp.net mvc 怎么获取后台处理进度,并展示到页面上?

0
悬赏园豆:20 [已解决问题] 解决于 2019-01-07 16:57

我想在在后台执行任务的时候页面显示执行进度,我在前端上设置了一个定时器,每隔一秒向后台获取一下处理进度,为什么我任务执行完了,定时器的回调才执行?

 function GetPercentage() {
                timeid = window.setInterval(function () {
                    $.ajax({
                        type: "POST",
                        url: "/home/getPercentage",
                        success: res => {
                            
                            console.log("定时器回调 "+res + "%");
                            
                            element.progress('Processing', res + '%')//设置页面进度条
                        }
                    })
                }, 1000);                
            }

这个是定时器代码

bgh的主页 bgh | 初学一级 | 园豆:36
提问于:2018-08-31 13:32
< >
分享
最佳答案
0

阻塞函数的当然要卡到那了,你使用异步非阻塞函数就不会了。基本原理还是要学习的。

收获园豆:10
花飘水流兮 | 专家六级 |园豆:10177 | 2018-09-01 10:30
其他回答(2)
0

因为SetInterval会产生回调堆积,直到你完成,才返回所有请求。你可以看network里面。请求应该都是poseing状态。
建议用settimeout来处理。

收获园豆:5
Melody.Gkx | 园豆:196 (初学一级) | 2018-08-31 15:04

你好,我使用了settimeout来执行,但是没有实现

支持(0) 反对(0) bgh | 园豆:36 (初学一级) | 2018-08-31 16:04

@bgh: 我看你代码settimeout

支持(0) 反对(0) Melody.Gkx | 园豆:196 (初学一级) | 2018-08-31 16:17

你可以把间隔调短,上传内容大一些,容易观察进度变化

支持(0) 反对(0) Melody.Gkx | 园豆:196 (初学一级) | 2018-08-31 16:20

@Melody.Gkx: 

function GetPercentage() {
                $.ajax({
                    type: "POST",
                    url: "/home/getPercentage",
                    success: res => {

                        console.log("定时器回调 " + res + "%");

                        element.progress('Processing', res + '%')
                    }
                })
                timeid=widnow.setTimeout("getPercentage()",1000)
                
            }
支持(0) 反对(0) bgh | 园豆:36 (初学一级) | 2018-08-31 16:21

@bgh: 可以加个判断if(res<100)再去循环调用计时器

支持(0) 反对(0) Melody.Gkx | 园豆:196 (初学一级) | 2018-09-05 09:35
0

这就对了啊,setInterval会等待回调函数的代码执行完成后,才开始执行下一次。具体是这样的

  1. 假如ajax执行完成要<1000ms,setInterval的代码就会每秒执行一次
    2.假如ajax执行时间是5000ms,setInterval本来应该在继续执行4次,她会记录,需要执行4次,但是先等待ajax执行,一旦ajax执行完,那累计的4次,会同时执行,不再有1s的间隔

所以,你上面的代码,要是想成立,完成ajax请求的总体时间(包括后台)一定要小于1000ms。

你可以了解一下,singleR,这个能实现你要的功能

收获园豆:5
Mad_Rabbit | 园豆:305 (菜鸟二级) | 2018-08-31 15:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册