【发布时间】:2020-09-13 11:05:57
【问题描述】:
我是 javascript 的新手,如果我误解了该语言是如何做一些事情的,很抱歉, 我正在构建一个排序算法可视化器,它根据色调值对块进行排序(使用 chroma-js 库): screenObject.items 中的每一项都是一个 Color 对象
//color objects are what I am sorting
class Color {
constructor(div, color, value) {
//this div on the html page
this.div = div;
this.color = color;
//hue value of the color
this.value = value;
}
update(color, value) {
this.color = color;
this.value = value;
this.div.style.backgroundColor = color;
}
}
class ScreenObject {
constructor() {
//this is an array of color objects
this.items = [];
}
bubbleSort() {
let solved = false;
while (!solved) {
let swaps = 0;
this.items.forEach((item, index) => {
if (index > 0) {
swaps += compare(this.items[index - 1], item);
}
});
if (swaps === 0) {
solved = true;
}
}
}
}
function compare(color1, color2) {
if (color1.value > color2.value) {
swap(color1, color2);
return 1;
} else {
return 0;
}
}
function swap(color1, color2) {
colorStore = color1.color;
valueStore = color1.value;
color1.update(color2.color, color2.value);
color2.update(colorStore, valueStore);
}
我遇到的问题是,这些颜色仅在程序完成后更新,如果我添加一个 setIterval 或 setTimeout,我只能在每次通过后更新颜色,而不是在每次比较/交换后更新(我想在比较颜色时添加特殊样式):
bubbleSort() {
let solved = false;
while (!solved) {
let swaps = 0;
setInterval(() => {
this.items.forEach((item, index) => {
if (index > 0) {
swaps += compare(this.items[index - 1], item);
}
});
}, 50);
if (swaps === 0) {
solved = true;
}
}
}
我希望能够在每次比较后看到颜色更新,例如 swap(1, 2) 用户看到 1 得到 2 的颜色和 2 得到 1 的颜色。
提前致谢!
【问题讨论】:
-
您不能暂停循环。这里的解决方案是首先不使用循环,而只使用递归
setTimeout()或带有计数器的`setInterval()。每次触发计时器回调时,您都会更新计数器,并且您会获得没有实际循环的定时循环的效果。 -
你可以在
forEach循环中添加setInterval -
@Kenny 这基本上就是 OP 现在正在做的事情,它并没有解决问题,因为间隔回调只会在事件队列中堆积,并且在循环完成之前不会触发,那么所有的回调将一个接一个地触发,它们之间没有间隔。
标签: javascript for-loop animation javascript-objects