我想在在后台执行任务的时候页面显示执行进度,我在前端上设置了一个定时器,每隔一秒向后台获取一下处理进度,为什么我任务执行完了,定时器的回调才执行?
function GetPercentage() { timeid = window.setInterval(function () { $.ajax({ type: "POST", url: "/home/getPercentage", success: res => { console.log("定时器回调 "+res + "%"); element.progress('Processing', res + '%')//设置页面进度条 } }) }, 1000); }
这个是定时器代码
阻塞函数的当然要卡到那了,你使用异步非阻塞函数就不会了。基本原理还是要学习的。
因为SetInterval会产生回调堆积,直到你完成,才返回所有请求。你可以看network里面。请求应该都是poseing状态。
建议用settimeout来处理。
你好,我使用了settimeout来执行,但是没有实现
@bgh: 我看你代码settimeout
你可以把间隔调短,上传内容大一些,容易观察进度变化
@Melody.Gkx:
function GetPercentage() { $.ajax({ type: "POST", url: "/home/getPercentage", success: res => { console.log("定时器回调 " + res + "%"); element.progress('Processing', res + '%') } }) timeid=widnow.setTimeout("getPercentage()",1000) }
@bgh: 可以加个判断if(res<100)再去循环调用计时器
这就对了啊,setInterval会等待回调函数的代码执行完成后,才开始执行下一次。具体是这样的
所以,你上面的代码,要是想成立,完成ajax请求的总体时间(包括后台)一定要小于1000ms。
你可以了解一下,singleR,这个能实现你要的功能