js实现所有异步请求全部加载完毕后,loading效果消失

  在实际开发中,一定有情况是这样的,一个页面我们有多个地方请求了ajax,在这种情况下,我们要实现数据没来之前出现我们炫酷的loading效果,而且要等到所有的ajax都请求完毕后,才让我们的loading效果消失,那么问题来了,每个ajax请求数据的时间都是不确定的,我们这个loading效果结束的逻辑又应该放到哪里呢?就好比这样(伪代码模拟):

console.log(‘loading效果图旋转中‘)
    var timer1 =  setTimeout(() => {
        console.log(‘第一个加载完成了‘);
    }, ‘随机的时间‘);
    var timer2 =  setTimeout(() => {
        console.log(‘第二个加载完成了‘);
    }, ‘随机的时间‘);
    var timer3 =  setTimeout(() => {
        console.log(‘第三个加载完成了‘);
    }, ‘随机的时间‘);

    console.log(‘loading效果图消失,我好慌,我应该放到哪里‘)

  是不是很难受,你说每个请求的结束时间都不确定,我哪知道我应该放到哪里结束,别怕,给大家提供两种解决方案,为了逻辑清晰,我就用一个延时器来给大家进行模拟了,莫要嫌弃:)

  第一种解决方案:我们设置一个标识,比如loadingNums,当loadingNums等于0的时候,我们让loading消失,接下来看代码(应该用await和async来模拟的,但是重要的是思路,其他的不重要,你懂的):

var loadingNums = 3;
    console.log(‘loading效果图旋转中‘)
    var timer1 =  setTimeout(() => {
        console.log(‘第一个加载完成了‘);
        loadingNums--;
        if(loadingNums==0){
            console.log(‘loading效果图消失‘)
        }
    }, 1000);
    var timer2 =  setTimeout(() => {
        console.log(‘第三个加载完成了‘);
        loadingNums--;
        if(loadingNums==0){
            console.log(‘loading效果图消失‘)
        }
    }, 2000);
    var timer3 =  setTimeout(() => {
        console.log(‘第二个加载完成了‘);
        loadingNums--;
        if(loadingNums==0){
            console.log(‘loading效果图消失‘)
        }
    }, 3000);

页面控制台打印效果:

 

    第二种解决方案:我们可以用ES6的Promise,如果有不了解Promise的同学自行去查询相关文档,接下来开始我们的操作,Promise有一个all方法,接收一个参数,这个参数我们可以传一个数组,在这个数组中我们可以写多个Promise,看到这里你应该明白了,我们可以把所有的异步操作都用Promise包起来,然后都放到这个数组内(漂亮,给自己的聪明才智鼓个掌好不好),如你所想,这个all方法是可以等到数组中所有的Promise加载完成之后才去执行的,那还等什么,准备发车,看代码:

console.log(‘loading效果图旋转中‘)
    var p1 = new Promise(function(resolve,reject){
        setTimeout(() => {
            console.log(‘第一个加载完成了‘);
            resolve();
        }, 1000);
    })
    var p2 = new Promise(function(resolve,reject){
        setTimeout(() => {
            console.log(‘第三个加载完成了‘);
            resolve();
        }, 2000);
    })
    var p3 = new Promise(function(resolve,reject){
        setTimeout(() => {
            console.log(‘第二个加载完成了‘);
            resolve();
        }, 3000);
    })

    Promise.all([p1,p2,p3]).then(function(){
        console.log(‘loading效果图消失‘);
    })

页面控制台打印效果:

好了已经很晚了,各位晚安早点睡觉,保护好自己的头发~~~

原文地址:https://www.cnblogs.com/bai1218/p/10134678.html

时间: 2024-10-09 18:06:47

js实现所有异步请求全部加载完毕后,loading效果消失的相关文章

两种方法实现在HTML页面加载完毕后运行某个js

两种方法实现在HTML页面加载完毕后运行某个js 这篇文章主要介绍了通过两种方法实现在HTML页面加载完毕后运行某个js,需要的朋友可以参考下 js方法: 复制代码 代码如下: <script type="text/javascript"> window.onload=function(){ var userName="xiaoming"; alert(userName); } </script> 以下为jQuery方法,需要引用jQuery

js图片未加载完显示loading效果

<html> <title>js图片未加载完显示loading效果</title> <body> <style> img{float:left;width:200px;height:200px;margin:0 10px 10px 0} </style> <script> //判断浏览器 var Browser=new Object(); Browser.userAgent=window.navigator.userAge

页面加载时的 Loading 效果

//页面加载时的 Loading 效果 $(window).load(function () { window.setTimeout(function () { $('body').removeClass('loading'); }, 1000); }); 上面的JS部分: HTML 部分 <body class="loading"> <div class="main"> </div></body> css .load

在css加载完毕后执行后续代码

最近在写项目的framework,写个JQueryMessageBox的类,以使用jquery ui中的dialog()来显示消息框,为了使方法方便调用,便加入了自动判断页面是否加入了ui.js和ui.css,代码如下: [javascript] view plaincopyprint? //如果没有包含ui.js,则引用 if ($('script[src$=""jquery-ui-1.8.11.custom.min.js""]').length == 0) {{

JS实现页面加载完毕之前loading提示效果

1.获取浏览器页面可见高度和宽度 var _PageHeight = document.documentElement.clientHeight, _PageWidth = document.documentElement.clientWidth; 2.计算loading框距离顶部和左部的距离(loading框的宽度为215px,高度为61px) var _LoadingTop = _PageHeight > 61 ? (_PageHeight - 61) / 2 : 0, _LoadingLe

easyui下拉列表级联操作,加载完毕后自动默认加载第一项的下级菜单

1.html代码: <td width="80px;">科目名称:</td> <td style="text-align: left;"> <select id="accountitem" name="accountitem" class="easyui-combobox" style="width:150px;" data-options=&q

图片加载完毕后执行JS代码

$("#img").load(function(){...}); 这是jquery提供的一个方法,但是在IE中会有BUG,IE8不支持,IE9以上刷新后也不会执行,只有强制刷新才执行,所以不能使用这个jquery提供的方法 应该使用: 只能通过JS的onload来触发事件,当然触发的事件代码中可以使用jquery代码(但是,IE8也有BUG,普通刷新的时候图片从缓存读入,读入速度比代码更快,导致onload代码不能运行,解决方法看继续往下看) document.getElementBy

vue.js学习之 如何在better-scroll加载完成后,自动滚动到最底部

首先我们需要使用scrollTo这个方法: scrollTo(x, y, time, easing) 参数: {Number} x 横轴坐标(单位 px) {Number} y 纵轴坐标(单位 px) {Number} time 滚动动画执行的时长(单位 ms) {Object} easing 缓动函数,一般不建议修改,如果想修改,参考源码中的 ease.js 里的写法 为了组件的复用性,我们需要在scroll组件的props添加一个flag,可以监听父元素是否开启滚动到最底部. scrollT

在HTML页面加载完毕后运行某个js

js <script type="text/javascript"> window.onload=function(){ //执行} </script> jQ <script type="text/javascript"> $(document).ready(function(){ //执行}); $(function(){ //执行}); </script> 原文地址:https://www.cnblogs.com/