我在长时间运行的处理任务中使用spin.js。
当我刚刚运行任务时,我在任务运行之前立即进行的UI更改在任务本身期间不显示。但是,当我使用调试器手动完成整个过程时,UI会按预期更新。是什么赋予了?我尝试在长时间运行的函数上运行setTimeout以给UI更新时间;没有骰子。
function updateGraphDisplay() {
var opts = {
lines: 13, // The number of lines to draw
length: 20, // The length of each line
width: 10, // The line thickness
radius: 30, // The radius of the inner circle
corners: 1, // Corner roundness (0..1)
rotate: 0, // The rotation offset
direction: 1, // 1: clockwise, -1: counterclockwise
color: '#000', // #rgb or #rrggbb or array of colors
speed: 1, // Rounds per second
trail: 60, // Afterglow percentage
shadow: false, // Whether to render a shadow
hwaccel: false, // Whether to use hardware acceleration
className: 'spinner', // The CSS class to assign to the spinner
zIndex: 2e9, // The z-index (defaults to 2000000000)
top: '50%', // Top position relative to parent
left: '50%' // Left position relative to parent
};
var spinner = new Spinner(opts).spin();
$('#chart').append(spinner.el);
// long running local computations (~4s)
Highcharts.charts[0].series[0].setData(sentimentDataPoints);
Highcharts.charts[0].series[1].setData(volumeDataPoints);
spinner.stop();
}
答案 0 :(得分:2)
你必须记住JS是单线程的。使用setTimeout(fn, delay)
时会发生的情况是,JS将函数fn
排队,以便将来运行大约delay
毫秒,然后继续运行setTimeout()
之后的行。
这意味着您的updateGraphDisplay()
函数将运行完成,包括创建微调器,然后在几毫秒后删除它。因此,为什么你没有看到它更新。
相反,您需要做的是在长时间运行的本地计算之后移动所有内容"进入传递给setTimeout()
的函数,以便在代码在将来运行之后执行。
缩写代码结构示例:
// initialisation code
// create spinner and append to DOM
setTimeout(function () {
// do calculations
// update graph
// clear spinner
}, 0); // even a delay of 0 will work