2015-06-13 2 views
0

Это часть моего кода. Изображение становится видимым через 23 миллисекунды правильно, но никогда не возвращается к скрытому, как сообщает вторая строка. Если я изменю его с 17 миллисекунд на значение, превышающее 23 миллисекунды, он будет работать. И наоборот, если я меняю первую строку на 16 миллисекунд, она работает. Похоже, что вторая строка выполняется и завершается перед первой строкой, и поэтому она остается видимой. Как я могу это исправить?SetTimeout Overlapping?

setTimeout(function(){img.style.visibility = 'visible';},23); 
setTimeout(function(){img.style.visibility = 'hidden';},17); 
+0

Ваш код говорит: «После того, как 17ms, установите img к скрытому. После 23ms установите img на видимое. " Вы должны помнить, что оба этих утверждения начнут таймер сразу, а не после того, как закончится первый таймер. – CodingIntrigue

ответ

0

Это потому, что 17 меньше 23. Код setTimeout является асинхронным, вторая строка не ждет завершения первого. Они оба запускают и регистрируют время для выполнения.

Если вы хотите, чтобы это было 17 миллисекунд позже, вы должны были бы сделать 23 + 17

5

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

Если ваша цель, чтобы иметь IMG становится видимым после 23 миллисекунд, а затем невидимые снова 17 миллисекунды позже, вы хотите поставить второй вызов внутри первыми.

setTimeout(function(){ 
    img.style.visibility = 'visible'; 
    setTimeout(function(){ 
     img.style.visibility = 'hidden'; 
    }, 17); 
}, 23); 

Это говорит о том, что люди - медленные, неуклюжие существа. :-) Для обычного человека этот образ в принципе никогда не будет видимым, 17 мс - слишком короткий интервал.

+0

Должен сказать, что вы медленно или * неуверенно печатали этот ответ :) – AmmarCSE

+0

@AmmarCSE: LOL! –

0

setTimeout() вызывает подпроцесс с задержкой. Таким образом, вторая строка выполняется до первого.

1

Это как setTimout работает

setTimeout(function(){img.style.visibility = 'visible';},23);//execute after 23 ms 
setTimeout(function(){img.style.visibility = 'hidden';},17);//execute after 17 ms 

. 
. 
. 
17 ms passed -> function(){img.style.visibility = 'hidden';} 
. 
. 
. 
23 ms passed -> function(){img.style.visibility = 'visible';} 

То, что вы, вероятно, хотите,

setTimeout(function() { 
    img.style.visibility = 'visible'; 
    setTimeout(function() { 
     img.style.visibility = 'hidden'; 
    }, 17); 
}, 23); 

Тогда это будет выглядеть

. 
. 
. 
23 ms passed -> function(){img.style.visibility = 'visible'; 
       setTimeout(function(){img.style.visibility = 'hidden';},17);} 
. 
. 
. 
40 ms passed -> function(){img.style.visibility = 'hidden';}