Вы должны будете знать условие всякий раз, когда одно слово было напечатано (и удалено в вашем случае). Из-за разной длины слова я предлагаю вам использовать обещания . С обещаниями вы можете проверить, что условие слова было напечатано полностью, а затем выполнить обещание.
Это дает вам возможность динамически ожидать печати каждого слова перед началом следующего. С помощью комбинации протокола итератора вы можете l oop для каждого обещания и ждать его завершения, прежде чем начинать следующее слово.
В приведенном ниже примере используется генераторная функция для создания такого итерируемый объект, который дает обещание для каждого слова, которое должно быть напечатано. При зацикливании этого объекта вы печатаете каждое слово, ждете, пока оно не закончится sh, и переходите к следующему слову в списке.
Преимущество этого подхода заключается в том, что вы можете легко контролировать время каждого слова и код не блокирует. Таким образом, другие сценарии будут запускаться без ожидания завершения этого сценария.
const wordElement = document.getElementById('word');
const skillData = {
js: [..."javascript"],
ts: [..."typescript"],
reactJS: [..."reactJS"],
html: [..."HTML5"],
css: [..."CSS3"],
reactNative: [..."React Native"],
node: [..."NodeJS"],
mongo: [..."MongoDB"],
phaser: [..."Phaser 3"],
py: [..."Python"],
};
const printWord = (word, speed) => new Promise(resolve => {
let index = 1;
let wordLength = word.length;
let interval = setInterval(() => {
if (index <= wordLength) {
let partOfWord = word.slice(0, index).join('');
requestAnimationFrame(() => {
wordElement.textContent = partOfWord;
});
index++
} else {
clearInterval(interval);
resolve(word);
}
}, speed);
});
async function* wordPrinter(data) {
for (const word of Object.values(data)) {
yield printWord(word, 100);
}
}
async function printWords() {
for await (const word of wordPrinter(skillData)) {
console.log('Word printed:', word.join(''));
}
return 'Done printing';
}
printWords().then(console.log);
<p id="word"></p>