2013-12-19 2 views
0

У меня есть следующий Jquery код с функцией SetTimeout, чтобы установить переменную в ложь, но она никогда не работает, а переменная всегда остается истиннымSetTimeout не стреляя в цикл

 for(var ff = 0; ; ff++) 
     { 
     if(dif == 0){ 
      break; 
     } 
     if (locked){ 
      // locked = false; 
      setTimeout(function(){ locked = false; },2000); 
     } 
     else{ 
      LeftKeyPressed(); 
      locked = true ; 
      setTimeout(function(){ locked = false; },3000); 
      dif--; 
     } 
     } 

может кто-нибудь помочь в том, как для установки заблокированной переменной на значение false через ровно две секунды после установки ее в true.

Вот fiddle of this issue.

+2

обеспечивает jsfiddle, который повторяет свой вопрос. Что такое? Как вы называете этот фрагмент? BTW, этот синтаксис неверен: 'dfd.done (LeftKeyPressed());' должно быть: 'dfd.done (LeftKeyPressed);' Или это coud будет правильным, но опять же, вы не знаете код этой функции –

+1

Это вообще плохая идея использовать бесконечный цикл для реагирования на изменение значения переменной. По крайней мере, есть интервал, который проверяет значение каждые 50 мс или около того, или если вы показываете больший контекст, где вам это нужно, я уверен, что есть лучший способ достичь фактической цели. – JJJ

+4

DONT do бесконечные петли, такие как «for (var ff = 0;; ff ++)» в javascript, он делает ваш сайт невосприимчивым, возможно, он блокирует цикл событий, а те setTimeouts не запускаются, потому что они не получают изменения, потому что ваш цикл занимает все свободное время , –

ответ

0

Окей, так как требования, каковы они, я не знаю, что именно вы хотите, но это ближе всего мне удалось сделать: http://jsfiddle.net/db6gJ/

Он вызывает метод три раза и дает изменения, чтобы сделать то, что вы хотите сделать, когда заблокировано - false или true. Кроме того, он не будет блокировать цикл событий (с этим бесконечным циклом), чтобы ваш сайт мог выполнять другие задачи, пока выполняются вызовы timeOut.

Javascript код также здесь:

var locked = true, 
    timesMax = 3, 
    timeCurrent = 0; 

var inputLoop = function() { 

    var delay = 2000; 

    if(locked) { 

     // Do something when locked is true 
     console.log("locked is true!"); 

     locked = false; 

    } else { 

     // Do something when locked is false 
     console.log("locked is false!"); 

     locked = true; 
     delay = 3000; 

    } 

    timeCurrent++; 

    // call again after delay, but call only 3 times 
    if(timeCurrent < timesMax) { 
     setTimeout(inputLoop, delay); 
    } 

}; 

// Launch it 
inputLoop(); 

Если вы смотрите на консоли JavaScript (в хроме: щелчку правой кнопкой мыши -> инспектировать элемент -> консоль) он должен напечатать:

locked is true! 
locked is false! 
locked is true! 

Также Следует отметить: ваш исходный код имел alert('out');, когда все сделано, но если честно, код продолжит выполнение в другом месте, в то время как ваш код «inputLoop» не делает ничего, кроме ожидающего обратного вызова, который будет запущен, и это так должно быть.

Если вы wan't знать, когда она вызывается последний раз, когда вы можете изменить один из предыдущих линий, чтобы быть:

// call again after delay, but call only 3 times 
if(timeCurrent < timesMax) { 
    setTimeout(inputLoop, delay); 
} else { 
    // Last call in this method 
    console.log('done!'); 
} 
Смежные вопросы