var speed = 200, len = 0; if (e in know) { function typing() { if (len < know[e].length) { if (len === know[e].length - 1) { t.innerHTML = know[e]; g = d.getAttribute("data-bottom") ? d.getAttribute("data-bottom") : 0; if (parseInt(g) < ((d.scrollHeight - t.offsetTop) - p.clientHeight) + 10) d.scrollTo(0, d.scrollHeight); else alert("new message"); } len++; setTimeout(typing, speed); } } typing();setTimeout vs setInterval código...
var setIn = setInterval(() => { if (len < know[e].length) { if (len === know[e].length - 1) { clearInterval(setIn); t.innerHTML = know[e]; g = d.getAttribute("data-bottom") ? d.getAttribute("data-bottom") : 0; if (parseInt(g) < ((d.scrollHeight - t.offsetTop) - p.clientHeight) + 10) d.scrollTo(0, d.scrollHeight); else alert("new message"); } len++; } }, speed)Estoy tratando de crear un bot de respuesta que comience a escribir después de 1 segundo y que responda a la velocidad de String.length y ambos hicieron lo mismo, pero alguien me dijo una vez que usar setTimeout es una mala práctica, pero los necesito. para correr de esa manera exacta. Si hay otra solución, estoy abierto a todas las sugerencias, gracias de antemano.
Puede tener múltiples enfoques:
setIntervalsetTimeoutwindow.requestAnimationFrame Si necesita esperar 1 segundo, entonces debe tener un setTimeout y adentro, le recomiendo que use la tercera opción si desea ahorrar rendimiento, pero combinar setTimeout con setInterval es una opción disponible. El uso de los mismos no es una mala práctica en general, solo en casos particulares.
Puede usar async/await para emular la escritura y crear retrasos:
// // Async timeout function const timeout = ms => new Promise(resolve => setTimeout(resolve, ms)); // // Bot typing function const runBot = text => { // Use promises return new Promise(async (resolve, reject) => { // DOM const div = document.getElementById('text'); // Create chars array const chars = text.split(''); // Wait 1 sec before typing await timeout(1000); // Type text while(chars.length) { // Put one char at iteration div.innerHTML += chars.shift(); // Wait some amount await timeout(100); } // Add new line to the text box div.innerHTML += '<br>' // Finish function return resolve(); }); } // // Text typing runner and button controller const typeText = async text => { // DOM const button = document.querySelector('button'); // Disable button button.disabled = true; // Run bot and wait till it finishes await runBot(text); // Enable button button.disabled = false; } <div id="text" style="padding:10px;border:1px solid #000"></div> <button onClick="typeText('This is demo text!')">Start bot</button>