需要JavaScript sleep()替换

时间:2011-04-13 14:46:09

标签: javascript

我知道这很糟糕:

function sleep(millis) {
    var date = new Date();
    var curDate = null;
    do { curDate = new Date();
    } while(curDate-date < millis);
}

EDIT:
function doSomethingQuickly(pixelData) {
    // loads an external image, filling the entire screen
    // overlays $pixelsData over image
}

但是我确实需要这种功能,因为doSomethingQuickly()返回的速度非常快,而且其他doSomethingQuickly()不能在上一次完成之前运行。这将是灾难性的只需将它们全部关闭并等待结果处理它们。

doSomethingQuicky();
sleep(500);
doSomethingQuicky();
sleep(500);
doSomethingQuicky();
sleep(500);
doSomethingQuicky();
sleep(500);
doSomethingQuicky();
sleep(500);

我的问题是,由于在JS中模拟睡眠是不好的,我如何使用setTimeout()或其他更可接受​​的方法实现相同

注意:这不在网络浏览器中

编辑: 您可以看到,如果它在没有睡眠的情况下运行5次,它将快速显示最终图像,它应该做的是1)显示图像2)暂停5秒3)重复您可以看到如果它运行了5次没有睡觉,它会很快显示最终的图像,它应该做的是1)显示图像2)暂停5秒3)重复

4 个答案:

答案 0 :(得分:4)

怎么样:

function sleep(ms,callback){
    setTimeout(callback,ms);
}
//basic usage
while (someStoppingcondition){
  sleep(500,doSomethingQuicky);
}

如果doSomethingQuicky始终是相同的函数,setInterval(请参阅其他答案)就足够了。确保它不会永远运行,使用clear[Interval/Timeout]来停止计时器。

如果您的问题是在下一个函数执行之前必须完成一个函数,这可能是解决它的方法:

function firstRunner(arg1,arg2,/* ... argx*/, nextRunner){
   //do things
   //after things are done, run nextRunner
   nextRunner();
}

答案 1 :(得分:3)

JavaScript是单线程的。任何系列的doSomethingQuicky();都应该按顺序执行。

除非你在doSomethingQuicky();内使用某些计时器功能,否则这是你的意思。在不知道这个功能的作用的情况下,很难提出建议。

答案 2 :(得分:3)

var interval = setInterval(doSomethingQuickly, 500)

...

clearInterval(interval);

我不知道代码在做什么。 JavaScript是单线程的,所以你不应该遇到任何问题。你也不应该睡觉,因为它睡在唯一的线程上。

答案 3 :(得分:0)

使用睡眠来等待函数返回总是一个坏主意。如果慢速功能花费的时间比预期的长,该怎么办?关于闲置时间的时间性能问题呢?

改为使用承诺:

// resolves immediatly to the string 'fast done'
const fast = new Promise(resolve => resolve('fast done'));

// resolves after 1 second to the string 'slow done'
const slow = new Promise(resolve => setTimeout(() => resolve('slow done'), 1000));

// resolves after 1 second to the array ['fast done', 'slow done'], then logs it for demo purposes
Promise.all([fast, slow]).then(console.log);

我认为Promise.all符合您的要求。它会在所有作为参数得到的诺言都得到解决时进行解析,因此您可以向其传递具有不同执行时间的多个函数,并在所有函数返回后继续执行代码。