首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么引导旋转器在计算密集型上下文中不可用

为什么引导旋转器在计算密集型上下文中不可用
EN

Stack Overflow用户
提问于 2019-09-04 17:21:10
回答 2查看 58关注 0票数 0

我知道Javascript是单线程的。但是,我不明白为什么下面的代码在计算密集型任务之前/之后不显示/隐藏一个自旋器。

代码大纲:

代码语言:javascript
复制
showSpinner();
computeIntensiveTask();
hideSpinner();

代码(我使用的是引导旋转器)

代码语言:javascript
复制
const showSpinner = () => {
    const $spinner = $('#spacewalk-spinner').find('.spinner-border');
    $spinner.show();
};

const hideSpinner = () => {
    const $spinner = $('#spacewalk-spinner').find('.spinner-border');
    $spinner.hide();
};

函数computeIntensiveTask()做了大量的sqrt()和其他三维矢量数学。

当代码运行时,旋转器就不会出现。为什么会发生这种情况?

更新0

作为一项测试,我尝试简单地更新spinner元素之前/之后的颜色:

document.getElementById('spacewalk-spinner').style.color = 'rgb(255,0,0)';之前

document.getElementById('spacewalk-spinner').style.color = 'rgb(0,255,0)';

只有“后”颜色发生了变化。

更新1

来澄清。如果我删除对hideSpinner()的调用并将showSpinner()更改为document.getElementById('spacewalk-spinner').style.display = 'block'。旋转器在 computeIntensiveTask()完成后显示computeIntensiveTask()。尽管如此,我还是把computeIntensiveTask()放在window.setTimeout的调用中,等待了500 ms。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-04 18:11:05

您需要使用setTimeout函数协调UI的更新。此外,您还需要在更新UI时定位showSpinnerhideSpinner函数。以这个片段为例。

代码语言:javascript
复制
const showSpinner = () => {
  const $spinner = $('#spacewalk-spinner').find('.spinner-border');
  $spinner.show();
  console.log('show');
};

const hideSpinner = () => {
  const $spinner = $('#spacewalk-spinner').find('.spinner-border');
  $spinner.hide();
  console.log('hide');
};


const computeIntensiveTask = () => {
  showSpinner();
  // begin the calculations after the UI updates by using setTimeout
  setTimeout(function() {
    for (var start = 1; start < 1000; start++) {
      // calculating...
      console.log('calc');
    }
    hideSpinner();
  }, 0);

};

computeIntensiveTask();
代码语言:javascript
复制
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="spacewalk-spinner">
  <div class="spinner-border" role="status">
    <span class="sr-only">Loading...</span>
  </div>
</div>

票数 1
EN

Stack Overflow用户

发布于 2019-09-04 17:24:19

试试这个:

代码语言:javascript
复制
showSpinner();
setTimeout(() => {
    computeIntensiveTask();
    hideSpinner();
}, 300);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57793152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档