Javascript睡眠/延迟/等待函数

Javascript睡眠/延迟/等待函数,javascript,function,delay,sleep,wait,Javascript,Function,Delay,Sleep,Wait,对不起,如果这个问题以前在这里被问过,我找不到合适的答案 我想创建一个JavaScript sleep/delay/wait函数,我可以在脚本中的任何地方调用它,比如jQuery的.delay() 我不能使用StimeTimeUT,因为我有一个PHP生成的脚本,所以不能把它放在两个不同的函数中,中间的超时。我需要创建一个函数,让我可以 alert("time started"); sleep(4000); alert("time up"); 我真的不想使用jQuery。与您指定的行为完全一致的

对不起,如果这个问题以前在这里被问过,我找不到合适的答案

我想创建一个JavaScript sleep/delay/wait函数,我可以在脚本中的任何地方调用它,比如jQuery的
.delay()

我不能使用StimeTimeUT,因为我有一个PHP生成的脚本,所以不能把它放在两个不同的函数中,中间的超时。我需要创建一个函数,让我可以

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

我真的不想使用jQuery。

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

理论上你可以做一个循环函数,循环的结束条件是基于时间的,但这会占用你的CPU,使浏览器没有响应,设计也会非常糟糕。我甚至拒绝为此写一个例子;)


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


您现在可以使用它,例如在带有harmony标志的Node.js中,使用Q.spawn(),例如,请参见(最后一个示例)。

您不能只插入一个函数来暂停Javascript

您必须使用
setTimeout()

例如:

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

function stopTimer () {
    timer.stop();
}
编辑:

对于用户生成的倒计时,它同样简单

HTML:

现在,您只需为
startTimer()
添加一个触发器,例如
onchange

,您将不得不使用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
inside
baz
在被调用时以
buzz
的形式开始,在调用结束时,
a
inside
foo
“完成”

基本上,将所有变量都包装到一个函数中,将所有变量向上移动到包装函数中,使包含的函数继承它们。然后,每次遇到
等待秒数
echo
a
setTimeout
,请结束该函数并启动一个新函数,从您停止的地方开始执行。

您可以使用此函数-

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}

这里有一个使用新的异步/等待语法的解决方案

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


您可以使用以下代码,它对函数进行递归调用,以便正确地等待所需的时间

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);
    };
}
函数exportar(页面,毫秒,总页面)
{

如果(页面不,你不能那样做。就这么简单。使用setTimeout或类似的解决方案。可能有许多相同的问题。你没有找到合适的答案,因为你不接受JavaScript不能像它那样工作。setTimeout,不管你喜不喜欢,都是正确的答案。你需要重新构建你的页面,否则会很有趣如果您需要延迟,您可以采取一些措施来处理它。@user2704237这看起来像是您在尝试实现一种新的基于JavaScript的高级语言。如果基于JavaScript,您无法实现与JavaScript工作方式完全相反的东西。是的,我想知道为什么我的答案是-1。我希望看到OP编写的代码在ES5 browse中工作rs.当你展示它时,请给我你想要的任何东西。这是正确的想法。因为这个问题是重复的,我在原始问题上留下了一个基于ES6的答案。那么“timer”应该是什么?我得到一个未捕获的引用错误:timer没有定义timer.start()和timer.stop()是占位符函数。在中,用您现在想要的任何命令替换它们。在您想要提供延迟的地方调用此函数,如睡眠(1000);旋转等待?哎哟。这会伤害移动设备。这不起作用,因为for循环的条件可以很快满足。即使您删除for循环的条件(例如for(;;){…})你最终会让单线程和DOM.com陷入困境,这导致我的chrome浏览器锁定并消耗过多的资源。不好。
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);
    });
}
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);
    };
}