Estoy construyendo una herramienta de simulación de algoritmos para simular cómo funcionan los algoritmos. En el algoritmo BFS , quería ralentizar la visualización de resultados
Así que usé la función setTimeout después de cada paso para esperar unos 10 ms antes de pasar al siguiente paso. Utilicé la promise de poder usar async para esperar fácilmente todo el período y obligar al algoritmo a detenerse hasta que finalice la función de espera.
function wait(time) { return new Promise(resolve => { setTimeout(() => { resolve(); }, time); }) } while (queue.length) { let currentId = queue[index++]; let tile = board.tileOf(currentId); tile.visit(); if (currentId == targetId) { return; } await wait(10); for (let direction of DIRECTIONS) { let childId = moveId(currentId, direction); if (childId == undefined) continue; childId = parseInt(childId); let child = board.tileOf(childId); if (child.available()) { child.visit(true); queue.push(childId); pervNode[childId] = currentId; } } }el problema es que cuando ejecuto el código funciona bien, pero a veces toma mucho tiempo mostrar la solución más y más de 10 ms.
Me pregunto por qué no es exacto. ¿Esto se debe al enfoque que estoy usando? y si hay una solución mejor, ¿cuál podría ser?
Como JavaScript es un lenguaje de subproceso único, cuando realiza una llamada de función dentro de setTimeout() , esta función se pone en cola y espera hasta que otras funciones en una pila de llamadas (que fueron llamadas antes) finalicen y la pila de llamadas se vacía . El tiempo que especifica como segundo parámetro para setTimeout() comienza a contar desde el momento en que coloca la función en la cola, pero no siempre la cola está vacía
no sé la salida real, pero creo que podría funcionar
while (queue.length) { let currentId = queue[index++]; let tile = board.tileOf(currentId); tile.visit(); if (currentId == targetId) { return; } let timer; const loop = () => { for (let direction of DIRECTIONS) { let childId = moveId(currentId, direction); if (childId == undefined) continue; childId = parseInt(childId); let child = board.tileOf(childId); if (child.available()) { child.visit(true); queue.push(childId); pervNode[childId] = currentId; } } }; const listener = () => { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { loop(); }, 100); }; listener(); }