【发布时间】:2016-09-23 17:26:42
【问题描述】:
在下面的最小示例中,旧内容的替换由setTimeout 推迟,以便用户有时间完成查看。与此同时,正在准备新的内容,以避免在执行潜在的昂贵任务时阻塞用户界面。
var div = document.getElementById('wrapper');
var newContent = document.createElement('ul');
setTimeout(function() {
var header = div.firstElementChild;
header.innerHTML = 'New Content';
header.nextElementSibling.remove();
div.appendChild(newContent);
}, 2000);
// Make new content while we wait
[1, 10, 100, 1000].forEach(function(x) {
var li = document.createElement('li');
li.innerHTML = 'Factorial of ' + x + ' is ' + factorial(x);
newContent.appendChild(li);
});
function factorial(num) {
if (num === 0) {
return 1;
} else {
return (num * factorial(num - 1));
}
}
<div id='wrapper'>
<h1>Old content</h1>
<p>Read it before it's gone.</p>
</div>
我对这种方法的担忧是它似乎无法处理 newContent 在更换到期时未准备好。我也不确定这种方法是否会阻塞用户界面,或者setTimeout使用的任务是否会同时执行。
如何确保用户界面在执行潜在的昂贵任务并在完成后立即使用时不被阻塞?
【问题讨论】:
-
如果您的
newContent是通过一些同步方法准备的,并且您确定timeout之后的内容的可用性,那么这样做没有害处.. -
找出时间。生成内容。再找时间。如果不到 2 秒,请等待剩余时间,然后更换。否则,立即替换内容。
-
对我来说看起来很合理。也许合并淡入/淡出所以内容的变化不是那么微妙
-
1000 阶乘远远超出了 JS 表示数字的能力。无论如何,“这是否可取”是用户体验问题,而不是编程问题,除非您询问您的特定实现是否是可取的方法。你为什么不需要担心
newContent没有准备好? -
您的语言不是假设的。它被称为 JavaScript,实现您想要的语言机制称为“承诺”。但是你必须调用它们;它们不会神奇地发生,它们不会在某件事完成之前完成,也不会改变一个不变的事实,即如果你想要完成或准备好某件事,那么它就必须完成或准备好。
标签: javascript settimeout