Вопрос по wait, delay, function, sleep, javascript – Javascript режим сна / задержки / ожидания

15

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

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

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

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

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

Есть много одинаковых вопросов. Вы не нашли подходящего ответа, потому что вы неЯ не согласен с тем, что JavaScript не поддерживаетработает так, как работает. Denys Séguret
Смотря чтодве функции " означает, встроенную функцию, вызываемуюsetTimeout() вполне может быть приемлемым. Lee Meador
setTimeout, нравится вам это или нет, является правильным ответом. Вам нужно реструктурировать свою страницу или функции, чтобы справиться с ней, если вам нужны задержки. Hamza Kubba

Ваш Ответ

6   ответов
9

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

Это правильный ответ. Я нене понимаю отрицательных голосов. whitehat101
1

Решение с использованием нового синтаксиса 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 только в асинхронных функциях.

2

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

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

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

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

Да, мне интересно, почему мой ответ получил -1 'д. Я'Я хотел бы видеть код, написанный OP для работы в браузерах ES5. Когда вы показываете это, пожалуйста, -1 мне столько, сколько вы хотите. kamituel
Это правильная идея. Так как этот вопрос дурак, я оставилответ на основе ES6 по первоначальному вопросу. Dan Dascalescu
0

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

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);
    };
}
1

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

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
это заставило мой браузер chrome заблокироваться и потреблять лишние ресурсы. Нехорошо. aspiringGuru
вызывайте эту функцию там, где вы хотите дать задержку, например, сон (1000); Tushar
Это нене работает, так как условие цикла for может быть выполнено довольно быстро. Даже если вы удалите условие цикла for (например, for (;;) {...}), вы 'в конечном итоге, потрясет один поток и, следовательно, DOM. Auxiliary
Ждать? Уч. Тот'собирается повредить мобильные устройства. Nathan Tuggy
14

вы не можете просто вставить функцию для приостановки 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

Теперь вы можете, вES2015 + асинхронный / ожидание. Dan Dascalescu
timer.start () и timer.stop () являются функциями-заполнителями. Замените их на любые команды, которые вы хотите Deep
и что такоетаймер» должно быть? Я получаю Uncaught ReferenceError: таймер не определен gicalle

Похожие вопросы