我知道这很糟糕:
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)重复
答案 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符合您的要求。它会在所有作为参数得到的诺言都得到解决时进行解析,因此您可以向其传递具有不同执行时间的多个函数,并在所有函数返回后继续执行代码。