Функция спящего режима/задержки/ожидания Javascript

Извините, если этот вопрос уже задан здесь раньше, я не нашел подходящего ответа.

Я хочу создать функцию ожидания/задержки/ожидания JavaScript, которую я могу вызвать в любом месте script, например jQuery .delay()

Я не могу использовать setTimeout, так как у меня есть script, который генерируется php, и поэтому я не могу использовать его в двух разных функциях с таймаутом в середине. Мне нужно создать функцию, которая позволяет мне делать

alert("time started");
sleep(4000);
alert("time up");

Я действительно не хочу использовать jQuery.

Ответ 1

Вы не можете просто добавить функцию для приостановки работы Javascript.

Вы должны использовать setTimeout()

Пример:

function startTimer () {
    timer.start();
    setTimeout(stopTimer,5000);
}

function stopTimer () {
    timer.stop();
}

EDIT:

Для вашего пользовательского обратного отсчета это так же просто.

HTML:

<input type="number" id="delay" min="1" max="5">

JS:

var delayInSeconds = parseInt(delay.value);
var delayInMilliseconds = delayInSeconds*1000;

function startTimer () {
    timer.start();
    setTimeout(stopTimer,delayInMilliseconds);
}

function stopTimer () {
    timer.stop;
}

Теперь вам просто нужно добавить триггер для startTimer(), например onchange.

Ответ 2

Вам придется использовать setTimeout, поэтому я вижу вашу проблему как

У меня есть script, который сгенерирован PHP, и поэтому я не могу поместить его в две разные функции

Что мешает вам генерировать две функции в script?

function fizz() {
    var a;
    a = 'buzz';
    // sleep x desired
    a = 'complete';
}

Может быть переписано как

function foo() {
    var a; // variable raised so shared across functions below
    function bar() { // consider this to be start of fizz
        a = 'buzz';
        setTimeout(baz, x); // start wait
    } // code split here for timeout break
    function baz() { // after wait
        a = 'complete';
    } // end of fizz
    bar(); // start it
}

Вы заметите, что a внутри baz запускается как buzz при его вызове и в конце вызова a внутри foo будет "complete".

В принципе, оберните все в функцию, переместите все переменные в эту функцию переноса так, чтобы содержащиеся функции наследовали их. Затем каждый раз, когда вы сталкиваетесь с wait NUMBER seconds, вы echo a setTimeout, завершаете функцию и начинаете новую функцию, чтобы выбрать, где вы остановились.

Ответ 3

Поведение, точное с указанным вами, невозможно в JS, реализованное в текущих браузерах. К сожалению.

Хорошо, вы могли бы теоретически создать функцию с циклом, в котором условие конца цикла было бы основано на времени, но это запустило бы ваш процессор, сделав браузер невосприимчивым и будет крайне плохой дизайн. Я отказываюсь даже написать пример для этого;)


Обновление: Мой ответ получил -1'd (несправедливо), но, я думаю, я мог бы упомянуть, что в ES6 (который не реализован в браузерах еще он по умолчанию включен в Node.js), можно будет написать асинхронный код синхронно. Вам понадобится promises и генераторы для этого.

Вы можете использовать его сегодня, например, в Node.js с флагами гармонии, используя Q.spawn(), см. это сообщение в блоге например (последний пример там).

Ответ 4

Вы можете использовать это -

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}

Ответ 5

Здесь используется решение, использующее новый синтаксис async/wait.

async function testWait() {
    alert('going to wait for 5 second');
    await wait(5000);
    alert('finally wait is over');
}

function wait(time) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve();
        }, time);
    });
}

Примечание. Вы можете вызвать функцию wait только в асинхронных функциях