23

抱歉,如果之前已经在这里提出过这个问题,我找不到合适的答案。

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

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

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

真的不想使用 jQuery。

4

6 回答 6

16

不幸的是,您不能只输入一个函数来暂停 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.

于 2013-10-15T19:21:46.287 回答
13

这是使用新的 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);
    });
}

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

于 2018-01-06T08:51:36.997 回答
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
}

您会注意到ainsidebazbuzz被调用时开始,在调用结束时,ainsidefoo将是"complete".

基本上,将所有内容包装在一个函数中,将所有变量向上移动到该包装函数中,以便包含的函数继承它们。然后,每次遇到await NUMBER seconds时,结束该函数并启动一个新函数以从上次中断的地方继续。echosetTimeout

于 2013-10-15T19:32:39.383 回答
2

在当前浏览器中实现的 JS 中不可能实现与您指定的行为完全相同的行为。对不起。

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


更新:我的答案是 -1'd(不公平),但我想我可以在 ES6 中提到(浏览器中尚未实现,Node.js 中也没有默认启用),可以编写一个同步方式的异步代码。为此,您将需要 Promise 和生成器。

您现在可以使用它,例如在带有和谐标志的 Node.js 中,使用 Q.spawn(),例如参见这篇博文(那里的最后一个示例)。

于 2013-10-15T19:16:16.127 回答
1

你可以使用这个 -

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
于 2015-02-13T05:19:47.833 回答
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);
    };
}
于 2018-02-06T20:20:12.147 回答