2016-05-08 8 views
3

Итак, я создал функцию, которая печатает текстовое письмо по букве, как показано ниже. (Я знаю, что моя схема именования не является отличной платой, не развлекайтесь, также имейте в виду я все еще достаточно новый для кодирования моего код может показаться немного странным/неэффективным.)Javascript setInterval становится короче каждый раз, когда он запускается

var text = document.getElementById("gametext") 
var dialog = "the entire text you want to print out" 
var talk = "The whole text gets added here, letter by letter" 
var charinc = 0 

function talky() { 
    setInterval(function(){ 
    if(charinc < dialog.length){ 
    talk = dialog.charAt(charinc++); 
    text.innerHTML += talk; 
    } 
    }, 100); 
    charinc = 0 
} 

и я называю эту функцию несколько раз в моем коде, устанавливая диалог бы то ни было, я хочу, чтобы напечатать, и затем вызов функции. И сначала все работает нормально, но каждый раз, когда я запускаю его, кажется, что письма печатаются быстрее и быстрее. я не совсем уверен, что происходит, или как это исправить. Я сделал несколько поисков в google, но ничего полезного не пришло.

+0

Почему вы инициализации 'talk', когда вы только собираетесь присвоить результат от' charAt' к нему? –

+1

Каждый раз, когда вы вызываете 'talky()', вы вызываете 'setInterval()' и регистрируете функцию, которая будет вызываться каждые 100 миллисекунд. Вы никогда не храните дескриптор из 'setInterval' ... и никогда не используете' clearInterval() 'на нем ... так что вы заканчиваете работу нескольких интервальных функций, которая дает _appearance_ периода сокращенного интервала. – canon

ответ

6

В первый раз, когда вы запускаете его, у вас есть один интервал, выполняемый каждые 100 мс.

Во второй раз, когда вы запускаете его, у вас есть два интервала, каждый из которых работает каждые 100 мс.

И так далее.

Поскольку у них одни и те же переменные, вы просто заставляете каждого увеличивать скорость вывода на одну запись каждые 100 мс.


Либо:

  • Вызов clearInterval(...) когда вы закончили
  • Проходят глобальные переменные в качестве аргументов talky поэтому они не распределяются между несколькими интервалами
  • Просто обновите переменные вместо того, чтобы называть talky
+0

Хорошо, я понимаю проблему сейчас, но я не слишком уверен, как я должен использовать clearInterval. Должен ли я называть его вручную каждый раз, когда я хочу работать в режиме разговора? Должен ли я вставить его где-нибудь в разговор? извините, если я звучу как идиот, но я все еще новичок в кодировании. (Кажется, я понимаю некоторые концепции легко, в то время как другие, такие как интервалы, идут прямо над моей головой.) – twondai

+0

«Когда вы закончили», , т.е. как 'else' to' if (charinc Quentin

3

setInterval позволит заданной им функции запускать каждые 100 мс в вашем случае. Если вы вызовете эту функцию несколько раз, как вы говорите, будет несколько интервалов, проходящих параллельно друг другу, что, вероятно, не то, что вы хотите.

Вы можете очистить существующий интервал, используя clearInterval с идентификатором, возвращаемым setInterval.

например.

var intervalId = setInterval(function() { console.log('hello, world!') }, 100); clearInterval(intervalId);

Смежные вопросы