Эта функция ниже не работает так, как я хочу; будучи новичком в JS, я не могу понять, почему.
Мне нужно, чтобы она ждала 5 секунд, прежде чем проверить, равно ли newState
-1
.
В настоящее время она не ждет, а сразу проверяет.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
Вы должны поместить свой код в функцию обратного вызова, которую вы передаете setTimeout
:
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}, 5000);
}
Любой другой код будет выполнен немедленно.
Вы не должны'т быть этим, правильному использованию тайм-аута является правильным инструментом для ОП'ы проблемы и любого другого случая, где вы просто хотите, чтобы запустить что-то после определенного периода времени. Иосиф Зильбер показал, что в его ответ. Однако, если в некоторых непроизводственных случае вы очень хочу повесить основного потока в течение периода времени, это будет делать.
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
Исполнение в форме:
console.log('before');
wait(7000); //7 seconds in milliseconds
console.log('after');
Я'вэ приехал сюда, потому что я создание простого теста для секвенирования смесь асинхронных операций длительные блокирующие операции (т. е. дорогих манипуляций с DOM) и это мой имитируемые действия. Его устраивает эта работа тонкая, поэтому я решил запостить для тех, кто приезжает сюда с подобным случаем использования. Даже если так, это's создание дата (объект) в цикл while, который может очень подавлять ГК, если он работает достаточно долго. Но я могу'т достаточно подчеркнуть, это подходит только для испытания, для построения каких-либо фактических функциональные возможности, вам следует обратиться к Иосифу Зильбер'ы ответ.
Здесь'ы решение, используя новый асинхронный/ждут синтаксис.
Будьте уверены, чтобы проверить поддержка браузеров как это новая функция, введенная с ECMAScript 6.
Вспомогательная функция:
const delay = ms => new Promise(res => setTimeout(res, ms));
Использование:
const yourFunction = async () => {
await delay(5000);
console.log("Waited 5s");
await delay(5000);
console.log("Waited an additional 5s");
};
Преимущество такого подхода заключается в том, что это делает ваш код выглядеть и вести себя как синхронный код.
Не стоит пытаться сделать паузу в 5 секунд на javascript. Это так не работает. Вы можете запланировать выполнение функции кода через 5 секунд, но вы должны поместить код, который вы хотите выполнить позже, в функцию, а остальной код после этой функции будет продолжать выполняться немедленно.
Например:
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('VIDEO HAS STOPPED');}
}, 5000);
}
Но если у вас есть код, подобный этому:
stateChange(-1);
console.log("Hello");
Оператор console.log()
будет запущен немедленно. Он не будет ждать, пока сработает тайм-аут в функции stateChange()
. Вы не можете просто приостановить выполнение javascript на заранее определенное время.
Вместо этого любой код, который вы хотите запустить с задержкой, должен находиться внутри функции обратного вызова setTimeout()
(или вызываться из этой функции).
Если вы попытаетесь сделать "паузу" с помощью цикла, то вы "зависнете" в интерпретаторе Javascript на некоторое время. Поскольку Javascript выполняет ваш код только в одном потоке, когда вы зацикливаетесь, больше ничего не может выполняться (никакие другие обработчики событий не могут быть вызваны). Таким образом, зацикливание в ожидании изменения какой-либо переменной никогда не сработает, потому что никакой другой код не сможет изменить эту переменную.
Используйте функцию задержки следующим образом:
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
Использование:
delay(function(){
// do stuff
}, 5000 ); // end delay
Кредиты переходят к пользователю CMS, см. https://stackoverflow.com/q/1909441/1066234.
Если вы'вновь в асинхронная функция Вы можете просто сделать это в одну строку:
console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);
Внимание, если цель NodeJS будет более эффективно использовать этот (он'ы предопределенную функцию promisified функции setTimeout):
await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec
Лучший способ создать функцию как для ожидания в Милли секунд, эта функция будет ждать миллисекунд указана в аргументе:
в
function waitSeconds(iMilliSeconds) {
var counter= 0
, start = new Date().getTime()
, end = 0;
while (counter < iMilliSeconds) {
end = new Date().getTime();
counter = end - start;
}
}
в
Попробуйте это:
//the code will execute in 1 3 5 7 9 seconds later
function exec() {
for(var i=0;i<5;i++) {
setTimeout(function() {
console.log(new Date()); //It's you code
},(i+i+1)*1000);
}
}
Исходя Иосиф Зильбер'ы ответ, я хотел бы сделать это так, немного более общий.
Вы бы свои функции (пусть's создавать на основе вопрос):
function videoStopped(newState){
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
И вы могли бы иметь функцию ожидания:
function wait(milliseconds, foo, arg){
setTimeout(function () {
foo(arg); // will be executed after the specified time
}, milliseconds);
}
В конце концов, вы бы:
wait(5000, videoStopped, newState);
Что'ы решение, я бы предпочел не использовать аргументы в функции ожидания (только с Foo ();
, а не фу(арг);
) но, что's для примера.
Я использовал его для запуска игры на ПК от края или IE. И это selfclose т. е. после 7 секунд.
Firefox и Google хром не может быть использован для запуска игры таким образом.
<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
var start = new Date().getTime();var end=start;
while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>
Создать новую функцию в JS
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
Вызвать функцию, когда вы хотите отложить казнь. Использовать в миллисекундах int для задержки.
####Some code
sleep(1000);
####Next line
с помощью AngularJS:
$timeout(function(){
if(yourvariable===-1){
doSomeThingAfter5Seconds();
}
},5000)