定时器轮询功能,多次调用后端查询,直到获得想要的结果setInterval

使用场景

我们需要从服务器端获取一些未来一小段时间内可以确定的事情。比如最经典的场景就是:想象一个用户在网页端通过扫码进行支付,我们怎么判断用户支付的状态。

需求

这是一个上传文件功能,因为处理文件数据需要一定的时间,处理结果不是能够马上得到的,因此在前端写了一个功能,不断向后端发送请求,直到获得想要的处理结果.

页面展示

image.png

前端代码

//导入处理结果
var UploadProgressTimmer
upload.render({
    elem: '#importresult' //绑定元素
    , url: '{:url("uploadfile")}' //上传接口
    , data: {id: "{$info.id}"}
    , accept: 'file' //普通文件
    , exts: 'csv' //只允许上传表格文件
    , progress: function () { //这个主要是防止重复提交问题,加了个遮罩功能
        layer.load(0,{shade: [0.5, 'gray'],content: '数据导入中,请勿关闭页面',success: function (layero) {
                layero.find('.layui-layer-content').css({
                    'padding-top': '39px',
                    'width': '300px',
                    'font-size':'20px'
                });
            }
        });
    }
    , done: function (res) {//主要部分
        if (res.code === 200) {
            layer.load(0,{shade: [0.5, 'gray'],content: '数据导入中,请勿关闭页面',success: function (layero) {
                    layero.find('.layui-layer-content').css({
                        'padding-top': '39px',
                        'width': '300px',
                        'font-size':'20px'
                    });
                }
            });
            UploadProgressTimmer =  setInterval(() => {
                $.post('{:Url("getNewStatus")}', function (data) {
                    if (data.data.status !== 26022){ //当后台返回的状态码不为26022时,即是想要的结果
                        layer.closeAll();//关闭遮罩
                        clearInterval(UploadProgressTimmer);//出现想要的结果,停止重复提交
                        layer.alert(data.data.info,{
                            title: '信息'
                        },function () {
                            layer.closeAll();
                            location.reload();
                        });
                    }
                });
            }, 1000)
        }
    }
    });

后端代码

/**
 * 查询结果接口
 */
public function getNewStatus()
{
    //处理结果导入查询(新)
    $getStatus = Paas::request('/sim/finance/statement/aaaaaaaaaa',[]);
    $statusMessage = array(
        '26020'=>'处理结果导入失败,必填项不能为空。',
        '26011'=>'上传处理结果失败。',
        '26010'=>'上传处理结果成功。',
        '26022'=>'正常处理中。'
    );
    foreach ($statusMessage as $key=>$value){
        if ($getStatus['status'] == $key){
            $getStatus['info'] = $value;
        }
    }
    return jsonReturn($getStatus, '', 200);
}

实际效果

321.gif

总结

核心就是setInterval(())。

setInterval()函数的用法与setTimeout()完全一致,区别仅仅在于setInterval()指定某个任务每隔一段时间就执行一次,也就是无限次的定时执行。

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值