Последовательное срабатывание нескольких случайных таймаутов в JavaScript - PullRequest
1 голос
/ 07 февраля 2009

Я знаю, с первого взгляда (из-за названия) это выглядит как "Вы пробовали искать в Google перед публикацией?" вопросы, но я не могу найти ответ на конкретный вопрос, который я испытываю. Извините, если я нуб .... еще учусь :) 1001 *

Мне нужно смоделировать паузу в javascript, но функция setTimeout (function_call, timeout) не работает для меня. Причина в том, что ... когда вызывается эта функция setTimeout, она вызывает функцию асинхронно.

Немного фона:
Я пытаюсь смоделировать текст, вводимый в div с произвольно установленными интервалами. Я хочу, чтобы это выглядело так, как будто человек действительно печатает сообщение, пока пользователь просматривает страницу. Поскольку тайм-аут является случайным интервалом, а вызов функции выполняется асинхронно, текст в конечном итоге печатается в случайном порядке.

Вот фрагмент того, что у меня есть:

typeString: function(s)
{
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime());
    }
}



Заранее спасибо за помощь.

CJAM



ОБНОВЛЕНИЕ: добавив задержку таймера к переменной, это позволило мне компенсировать timeOut для асинхронных вызовов. Спасибо всем за ваши быстрые ответы. Вот обновленный код:

typeString: function(s)
{
    var delay = 0;

    for(var i=0;i<s.length;i++)
    {                     
        var c = s.charAt(i);
        setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime());
    }
}

Ответы [ 3 ]

3 голосов
/ 07 февраля 2009

Вы пытались совокупно установить время ожидания? Вставьте переменную вне вашего цикла и инициализируйте ее на 0. Давайте назовем это timeout сейчас. Добавьте случайное количество времени к этой переменной в начале каждой итерации вашего цикла и сделайте из этого время ожидания. Таким образом, вы гарантированно вызываете функции по порядку.

2 голосов
/ 07 февраля 2009

Ваша проблема в том, что вы используете одну из них, все время отсрочено, начиная с этого момента - следующий таймер должен быть запущен после предыдущего. Просто добавьте предыдущую задержку таймера к новому таймеру.

typeString: function(s)
{
    var delay = 0;
    for(var i=0;i<s.length;i++)
    {                      
        var c = s.charAt(i);
        delay = delay + this.genRandomTime();
        var temp = setTimeout("MessageType.typeChar('" + c + "')", delay );
    }
}
1 голос
/ 07 февраля 2009

Вместо передачи каждому событию таймера того символа, который должен отображаться, пусть каждый обработчик события извлекает следующий символ из очереди (массив, список и т. Д.), Чтобы сохранить порядок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...