Я пишу простой скрипт, который печатает текст на экране по одному символу за раз.
Я делаю так, чтобы функция (которую я назвал slowPrint
) могла получить массив строк. Каждый элемент в массиве представляет сообщение.
Это код, который у меня есть:
Однако я не получаю ожидаемый результат.
Я подозреваю, что это отчасти связано с асинхронной природой кода, хотя у меня нет полного и ясного понимания того, что происходит и как это исправить.
Начнем с того, что теги <br />
печатаются перед любым сообщением, что говорит мне о том, что внешний цикл завершается еще до запуска вложенного цикла.
Однако, когда вложенные циклы начинаются, каждая строка в массиве печатается с интервалом в одну секунду, но целиком , а не символ за символом .
Чего мне не хватает?
Кроме того, кто-нибудь может объяснить, пожалуйста, следующее поведение метода setTimeout
?
Сценарий 1 : Когда я устанавливаю второй аргумент в i * 1000
, вторая строка печатает одну секунду за другой (опять же, вся строка, а не символ за символом)
const messages = [
"all systems are operational",
"you may proceed"
];
function slowPrint(args) {
let screen = document.getElementById('screen');
for (let i = 0; i < args.length; i++) {
let message = args[i];
for (let j = 0; j < message.length; j++) {
setTimeout(function () {
screen.innerHTML += message[j];
}, i * 1000);
}
screen.innerHTML += '<br />';
}
}
slowPrint(messages)
<div id="screen"></div>
Сценарий 2 : Когда я устанавливаю второй аргумент в j * 1000
, вывод совершенно неожиданный: каждые вторые символы печатаются в наборах по 2, но в непонятном порядке; печатается только последнее слово из последних аргументов, как и все остальные.
Сценарий 3 : Когда я устанавливаю второй аргумент равным 1000
, ВСЕ строки в массиве печатаются через одну секунду.
Что происходит?