Javascript режим сна / задержки / ожидания

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

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

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

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

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

 Denys Séguret15 окт. 2013 г., 21:15
Нет вы можете'не делай так. Так просто. Используйте setTimeout или аналогичные решения.
 Hamza Kubba15 окт. 2013 г., 21:28
Это нене могу изменить то, что я сказал ... использоватьsetTimeout(runMeAfterDelay(), NUMBER * 1000);
 Denys Séguret15 окт. 2013 г., 21:18
Есть много одинаковых вопросов. Вы не нашли подходящего ответа, потому что вы неЯ не согласен с тем, что JavaScript не поддерживаетработает так, как работает.
 Denys Séguret15 окт. 2013 г., 21:17
 Lee Meador15 окт. 2013 г., 21:19
Смотря чтодве функции " означает, встроенную функцию, вызываемуюsetTimeout() вполне может быть приемлемым.
 Hamza Kubba15 окт. 2013 г., 21:20
setTimeout, нравится вам это или нет, является правильным ответом. Вам нужно реструктурировать свою страницу или функции, чтобы справиться с ней, если вам нужны задержки.
 Dan Dascalescu07 окт. 2016 г., 12:12
@Paul: тем временем JavaScript реализовалЖдите.
 Paul S.15 окт. 2013 г., 21:28
@ user2704237 Это звучит так, как будто вы пытаетесь реализовать новый более высокий язык, основанный наJavaScript, Вы можете'реализовать что-то принципиально противоречащее тому, какJavaScript работает, если оно основано на этом.
 user270423715 окт. 2013 г., 21:24
@HamzaKubba моя проблема в том, что пользователь генерирует код, вводя в текстовое поле и используя "подожди НОМЕР секунд, чтобы остановить код. Мне нужен способ конвертацииподожди НОМЕР секунд в код JavaScript.
 Hamza Kubba15 окт. 2013 г., 21:18
Причина, по которой вы не можете использовать setTimeout, нене имеет смысла. Вы можете сделать так, чтобы одна функция вызывала другую после задержки setTimeout. Покажите нам код, который неМы не можем работать с setTimeout, и мы сможем вам помочь.

Ответы на вопрос(6)

SetTimeout так что я вижу вашу проблему как

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

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

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 ВыechosetTimeout, конецфункция и начать новыйфункция подобрать там, где вы остановились.

 whitehat10125 окт. 2013 г., 09:35
Это правильный ответ. Я нене понимаю отрицательных голосов.

Решение с использованием нового синтаксиса async / await.

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 только в асинхронных функциях.

точное к указанному вами, невозможно в JS, как это реализовано в современных браузерах. Сожалею.

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

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

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

 kamituel21 июл. 2014 г., 09:13
Да, мне интересно, почему мой ответ получил -1 'д. Я'Я хотел бы видеть код, написанный OP для работы в браузерах ES5. Когда вы показываете это, пожалуйста, -1 мне столько, сколько вы хотите.
 Dan Dascalescu07 окт. 2016 г., 12:13
Это правильная идея. Так как этот вопрос дурак, я оставилответ на основе ES6 по первоначальному вопросу.

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

function exportar(page,miliseconds,totalpages)
{
    if (page <= totalpages)
    {
        nextpage = page + 1;
        console.log('fnExcelReport('+ page +'); nextpage = '+ nextpage + '; miliseconds = '+ miliseconds + '; totalpages = '+ totalpages );
        fnExcelReport(page);
        setTimeout(function(){
            exportar(nextpage,miliseconds,totalpages);
        },miliseconds);
    };
}

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

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
 aspiringGuru28 сент. 2018 г., 02:05
это заставило мой браузер chrome заблокироваться и потреблять лишние ресурсы. Нехорошо.
 Tushar13 февр. 2015 г., 06:20
вызывайте эту функцию там, где вы хотите дать задержку, например, сон (1000);
 Auxiliary13 апр. 2017 г., 02:50
Это нене работает, так как условие цикла for может быть выполнено довольно быстро. Даже если вы удалите условие цикла for (например, for (;;) {...}), вы 'в конечном итоге, потрясет один поток и, следовательно, DOM.
 Nathan Tuggy13 февр. 2015 г., 06:45
Ждать? Уч. Тот'собирается повредить мобильные устройства.
Решение Вопроса

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

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

Пример:

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

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

РЕДАКТИРОВАТЬ:

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

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

 Deep11 февр. 2015 г., 12:12
timer.start () и timer.stop () являются функциями-заполнителями. Замените их на любые команды, которые вы хотите
 gicalle11 февр. 2015 г., 10:54
и что такоетаймер» должно быть? Я получаю Uncaught ReferenceError: таймер не определен
 Dan Dascalescu07 окт. 2016 г., 12:12
Теперь вы можете, вES2015 + асинхронный / ожидание.

Ваш ответ на вопрос