@GeKskill

JS setTimeout рекурсия?

Не выходит сообразить почему только один раз вызывается setTimeout()?
Печатает только 2 буквы.
class app {

    constructor(options) {
        this.options = options;
    }

    typeWriter(text = '', target = 'typewriter', speed = 50, i = 0){
        let that = this;
        console.log(speed);
        if ( text.length > i ) {
              document.getElementById(target).innerHTML += text.charAt(i);
              
              setTimeout( that.typeWriter, speed , text, target, speed, ++i );
        } 
    }
}

let wow = new app();

wow.typeWriter('Some text');


v2 - стрелочная функция решила проблему:
class app {

    constructor(options) {
        this.options = options;
    }

    typeWriter(text = '', target = 'typewriter', speed = 50, i = 0){
        if ( text.length > i ) {
              document.getElementById(target).innerHTML += text.charAt(i);
              setTimeout(() => { this.typeWriter( text, target, speed, ++i ) }, speed );
        } 
    }
}
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
SagePtr
@SagePtr
Еда - это святое
Уверены, что this внутри вызова функции typeWriter у вас всегда будет указывать на один и тот же объект?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
На коленке набросал, вроде работает. Сравните с Вашим решением.

const root = document.getElementById('root');

function writeText(text, delay) {
  if (!text) {
    return;
  }
  
  const char = text[0];
  const remaining = text.slice(1);
  
  setTimeout(() => {
    root.textContent = root.textContent + char;
    writeText(remaining, delay);
  }, delay);
}

function run() {
  writeText('hello world', 50);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
summer Ярославль
от 100 000 до 140 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
19 апр. 2024, в 23:00
5000 руб./за проект
19 апр. 2024, в 20:43
20000 руб./за проект