代码之家  ›  专栏  ›  技术社区  ›  The KNVB

创建长计算的加载屏幕

  •  0
  • The KNVB  · 技术社区  · 8 年前

    我需要做一个巨大的计算。所以,我指的是 here 创建一个简单的加载屏幕。不幸的是,计算完成后将显示加载屏幕。

    class RosterScheduler
    {
       .........................
       autoAssign()
       {
        var startDate=parseInt($("#autoPlannStartDate").val());
        var endDate=parseInt($("#autoPlanEndDate").val());
        $("body").addClass("loading");
        if (startDate>endDate)
            alert("Invalid start date or end date selection");
        else
        {   
            if (this.rosterTable.haveInvalidPreferredShift(startDate,endDate))
                alert("Invalid shift requirement detected");
            else
            {
                var self=this;
                var finalRoster;
                var roster,tempAverageSD,lowestAverageSD=100.0;
    
                this.theLowestSDRosters=[];
                this.theLowestMissingShiftRosters=[];
                for (var i=0;i<100;i++)
                {   
                    this._genRoster(startDate,endDate);
                }
                console.log("Done");
            }
        }   
       } 
    }
    

    我发现如果我注意到for循环,加载屏幕工作正常。 如果我取消对for循环的注释,加载屏幕将在控制台中显示“Done”之后显示。我怎样才能解决这个问题?我试过将genRoster函数转换为Promise函数,但是它不起作用。

    1 回复  |  直到 8 年前
        1
  •  3
  •   CertainPerformance    8 年前

    看起来像 _genRoster 舞台调度 浏览器,在循环完成之前不给它任何重新呈现/重新绘制的资源。一种可能是运行循环 之后 给浏览器几毫秒来渲染 .loading :

    this.theLowestSDRosters = [];
    this.theLowestMissingShiftRosters = [];
    setTimeout(() => {
      for (var i = 0; i < 100; i++) {
        this._genRoster(startDate, endDate);
      }
      console.log("Done");
    }, 50);
    

    requestAnimationFrame ,从而使浏览器有时间重新绘制,然后立即运行重循环:

    document.body.style.backgroundColor = 'green';
    window.requestAnimationFrame(() => {
      console.log('start, setting timeout');
      setTimeout(() => {
        for (let i = 0; i < 1000000000; i++) {
        }
        console.log('done');
      });
    });