Javascript睡眠/延迟/等待功能

时间:2013-10-15 19:13:53

标签: javascript function delay sleep wait

很抱歉,如果此问题已在此处提出,我找不到合适的答案。

我想创建一个JavaScript睡眠/延迟/等待函数,我可以在脚本的任何地方调用它,比如jQuery的.delay()

我无法使用setTimeout,因为我有一个由php生成的脚本,因此无法将其放入两个不同的函数中,中间超时。我需要创建一个允许我做的功能

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

真的不想使用jQuery。

6 个答案:

答案 0 :(得分:15)

你不能只是放入一个暂停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

答案 1 :(得分:10)

您必须使用 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开始,在调用结束时,afoo将会{ "complete"

基本上,将所有变量包装在函数中,将所有变量移动到包装函数中,以使包含的函数继承它们。然后,每当您遇到wait NUMBER seconds echo setTimeout时,请结束功能并启动新的功能以选择你离开了。

答案 2 :(得分:2)

在JS中,与当前浏览器中实现的行为完全不同。遗憾。

好吧,理论上你可以创建一个循环函数,其中循环的结束条件将基于时间,但这会占用你的CPU,使浏览器无响应并且设计极差。我甚至拒绝为此写一个例子;)


更新:我的答案得到-1(不公平),但我想我可以在ES6中提及(不是在浏览器中实现,也不是默认情况下它在Node.js中启用),可以以同步方式编写异步代码。你需要承诺和发电机。

你现在可以使用它,例如在带有和声标志的Node.js中,使用Q.spawn(),例如,参见this blog post(最后一个例子)。

答案 3 :(得分:2)

你可以使用它 -

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

答案 4 :(得分: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);
    });
}
  

注意:您只能在异步函数中调用函数等待

答案 5 :(得分: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);
    };
}