Временная задержка между двумя строками кода в javascript, а не настройкой
есть функция, которая добавит временную задержку между двумя строками кода. Не задание, потому что для параметра settimeout требуется функция/объект в своих аргументах.
Я ищу что-то вроде этого псевдокода
write "abc";
delay(500);
write "xyz";
ТИА
Изменить:
решение jimr в моей другой нитке работало для моей цели, а также Robusto's.
Мне просто интересно, почему методы "сна", заданные ссылками Robusto и CMS, не являются предпочтительными. Как это будет отличаться от метода settimeout, так как они оба вводят паузу в коде? (setimeout приостанавливается до выполнения функции, метод sleep приостанавливается до выполнения следующей строки.)
Ответы
Ответ 1
Ниже приведено неудобное и уродливое, и я бы никогда не делал этого в своем собственном коде, и я НЕ РЕКОМЕНДУЕТ ЭТО ВСЕ, но он показывает, что такая вещь возможна.
// time arg is in milliseconds
function delay(time) {
var d1 = new Date();
var d2 = new Date();
while (d2.valueOf() < d1.valueOf() + time) {
d2 = new Date();
}
}
Ответ 2
Спящий метод недоступен, поскольку выполнение JavaScript блокирует браузер, поэтому метод sleep блокирует браузер на 500 мсек, действительно ли вы хотите, чтобы ваш браузер не отвечал на полсекунды?
Используйте setTimeout, как было предложено.
Ответ 3
Вы можете использовать setTimeout так, чтобы он почти казался, что код работает в двух строках:
write('abc')
setTimeout(function() {
write('xyz')
},500)
Ответ 4
В JavaScript 1.7, используя yield
с async.js, вы можете сделать следующее:
var yourFunction = _(function () {
write("abc");
yield to.sleep(.500);
write("xyz");
});
Ответ 5
Я не знаю, что вы пытаетесь сделать здесь, но здесь есть одна конкретная причина того, почему пользовательский сон может не работать для ваших целей, предполагая, что браузер замерзает, для вас это не проблема.
Вы управляете DOM любым шансом между этими двумя командами записи? Если да, то он просто не будет работать (как воспринимается конечным пользователем), хотя узлы DOM будут сконструированы/обновлены в памяти, дисплей не будет обновляться, так как эта часть не является синхронной. Процессор заблокирован в этом цикле, и оба обновления DOM будут обновляться на экране, когда этот цикл завершится. Смотрите пример.
В идеале вы должны увидеть "Привет", а через 5 секунд - "Мир" на экране. Однако в Chrome, Safari и Firefox вы увидите как "Hello", так и "World" в конце 5 секунд. Журналы консоли доказывают, что DOM node построен в памяти, но не обновляется на экране до конца, как вы можете видеть себя.
Ответ 6
Насколько я знаю, setTimeout()
- единственный способ сделать это.
function write(out) {
alert(out);
}
// ...
write('abc');
setTimeout(function() { write('xyz')}, 500);
Ответ 7
Я тоже скучаю по javascript, так как java SE и энтузиаст EE, не имеющий моего sleep()
, меня разочаровал JavaScript, я сделал таймер, и я надеюсь, что он может быть вам полезен, он использует jQuery, и это справедливо просто, вы можете перепроектировать его и создать что-то, что соответствует вашим потребностям:
function timer(object, time) {
$(object).attr({
'onclick': ''
});
if (time < 0) {
$(object).attr({
'onclick': "timer('#clock', 6000);"
});
return;
}
$(object).animate({
opacity: 1
}, 1, function() {
$(object).empty();
$(object).append(time + 'ms');
time--;
timer(object, time);
});
}
#clock {
width: 65px;
height: 20px;
border: 1px solid #F00;
text-align: center;
line-height: 20px;
background-color: #000;
color: #FFF;
font-weight: 900;
}
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<title>HTML5, CSS3 and JavaScript demo</title>
</head>
<body>
<div id="clock" onclick="timer('#clock',6000);">--s</div>
</body>
</html>
Ответ 8
setInterval(function delay{ //loops every 300 milliseconds
setTimeout(function firstLineOfCode(){ //waits 100 milliseconds then runs code
write('abc');
},100)
setTimeout(function secondLineOfCode(){ //waits 200 milliseconds (100 after previous line) then runs code
write('def');
},200)
setTimeout(function thirdLineOfCode(){ //waits 300 milliseconds (100 after previous line) then runs code
write('ghi');
},300)
},300) //loops after total of delays in function delay()