2012-06-10 3 views
1

Что это все о

Сейчас я работаю над сценарием для смайликов на костре чата службы, поскольку они не имеют функции смайликов. Прямо сейчас он запускает смайлик очень медленно, так как он использует setInterval, который должен проверять когда-либо 200 миллисекунд, если в чате есть новое сообщение. Я делаю это, делая две переменные «a» и «b» с var a,b;. Итак, тогда в первом набореInterval я время его с миллисекунды. Внутри этого я просто передаю переменную «а» значение HTML чата. Затем во втором setInterval (200) я даю переменной «b» значение HTML тоже, но это другое время, поэтому теперь я проверяю HTML в операторе if, а если он отличается, я запускаю функцию для изменения символа к смайлику. Я сделал это, чтобы улучшить производительность. Прежде чем он будет проверять смайлики, даже если никто в чате Campfire не написал что-то, поэтому нет необходимости проверять смайлики.setInterval не работает правильно

Это полная функция:

var a, b; 
setInterval(function() { 
    a = $('#chat').html(); 
    console.warn("Chat HTML has been Scanned"); 
}, 150); 
var t = "0"; 
setInterval(function() { 
    b = $('#chat').html(); 
    console.warn("Chat got scanned for Change in html."); 
    if (emoOn == true) { 
     if (t === $('#num12345').text()) { 
      $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>'); 
      $('#num12345').text("111") 
     } 
     if (a !== b) { 
      turnOn(); 
      console.log("CHANGE") 
     } else { 
      turnOn("off"); 
     } 
    } 
}, 200)​; 

Проблема

Как вы можете видеть в приведенном выше коде я бегу 3 консолей. В консолях я ожидаю, что предупреждение «Чат HTML было отсканировано», а затем «Чат получил проверку на изменение в html». в этом порядке на все время. Но вместо того, чтобы «чат HTML был отсканирован», предупреждающие ботинки в два раза, он просто не работает, как будто я имидж его работаю.

И когда новое сообщение показывает, что оно должно войти в журнал «Изменить», но большую часть времени это не так, и я думаю, что это проблема setIntervals. Похоже, что они не правильные сроки. Но я действительно не хочу сказать, что JavaScript вызывает эту проблему, но я не знаю, что еще может быть. Также я использую Chrome.

+0

@undefined ОП не сказал, что ему это не нравится. А также 'setInterval()' не является человеком. – Nathan

+0

@Nathan, sry, я шутил, конечно, это не человек – undefined

+0

@undefined О, хорошо, все хорошо :) – Nathan

ответ

1

setInterval является асинхронным, поэтому, когда ваш первый вызов ожидает, интерпретатор javascript переходит к следующему заданию (в этом случае значение t устанавливается на «0», а затем на ваш второй вызов setInterval).

Редактировать: Я думаю, проблема заключается в том, что вы определяете свои вызовы setInterval в одно и то же время, но точность таймеров javascript не так уж велика (см. Здесь: http://ejohn.org/blog/accuracy-of-javascript-time/).

Вы могли бы назвать второй setInterval после SetTimeout, чтобы дать себе немного буфера:

var a, b; 
setInterval(function() { 
    a = $('#chat').html(); 
    console.warn("Chat HTML has been Scanned"); 
    var t = "0"; 
}, 2000); 
setTimeout(function(){ 
    setInterval(function() { 
     b = $('#chat').html(); 
     console.warn("Chat got scanned for Change in html."); 
     if (emoOn == true) { 
      if (t === $('#num12345').text()) { 
       $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>'); 
       $('#num12345').text("111") 
      } 
      if (a !== b) { 
       turnOn(); 
       console.log("CHANGE") 
      } else { 
       turnOn("off"); 
      } 
     } 
    }, 2000)​; 

}, 500); 

Это установит второй вызов setInterval полсекунды после того, как первый, вы могли бы уйти с намного меньше, чем это (хотя бы более 30 мс должно быть достаточно).

+0

Это делает все хуже .. «Чат получил проверку на изменение в html». предупреждение теперь появляется примерно 80 раз, а затем другое. – Shawn31313

+0

Подождите, вы ожидаете, что каждый вызов setInterval будет запущен только один раз? setInterval будет запускаться каждые x миллисекунд, поэтому функция во втором вызове setInterval будет выполняться десять раз в секунду. setTimeout будет выполняться только один раз, если это то, что вам нужно. –

+0

Нет, я не хочу, чтобы он просто запускался один раз. Я хочу, чтобы он переключился, но прямо сейчас он делает одно предупреждение, а затем еще один, как 80 раз, а затем это одно предупреждение снова. Но у меня это получилось. Но сейчас первые 2 предупреждения работают нормально, но теперь после 2-го предупреждения они оба появляются быстро после друг друга, чего он не делал до – Shawn31313

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