在Javascript中加入延迟

JGC*_*JGC 65 javascript

我需要为我的Javascript代码添加大约100毫秒的延迟,但我不想使用setTimeoutwindow对象的功能,我不想使用繁忙的循环.有没有人有什么建议?

And*_*ore 126

不幸的是,这setTimeout()是唯一可靠的方式(不是唯一的方法,但唯一可靠的方法)暂停脚本的执行而不阻止UI.

它实际上并不难,而不是写这个:

var x = 1;

// Place mysterious code that blocks the thread for 100 ms.

x = x * 3 + 2;
var y = x / 2;
Run Code Online (Sandbox Code Playgroud)

你用setTimeout()这种方式重写它:

var x = 1;
var y = null; // To keep under proper scope

setTimeout(function() {
    x = x * 3 + 2;
    y = x / 2;
}, 100);
Run Code Online (Sandbox Code Playgroud)

我知道使用setTimeout()涉及更多的思考而不是理想的sleep()功能,但遗憾的是后者不存在.有许多变通方法可以尝试实现这些功能.一些使用繁忙的循环:

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

其他人使用XMLHttpRequest绑定服务器脚本,在返回结果之前会休眠一段时间.

不幸的是,这些是解决方法,可能会导致其他问题(如冻结浏览器).建议简单地坚持推荐的方式,即setTimeout()).

  • **@ James M.:**完全同意......我从来不明白为什么围绕`setTimeout()`会有这么大的耻辱. (3认同)
  • 我在笔记本电脑上使用NoScript正是因为人们使用睡眠功能或其他无意义的紧密循环等功能.否则它突然在我的腿上烧了一个洞. (2认同)
  • 我不相信setTimeout()有任何围绕它的耻辱,它只是它并不总是容易产生所需的效果.例如,假设您希望在进程密集型循环中将处理器空闲一小段时间以避免锁定浏览器.对于没有经验的JavaScript程序员来说,使用setTimeout实现此结果可能很困难. (2认同)

小智 13

我刚才有一个问题,我需要妥善解决这个问题.

通过Ajax,脚本获取X(0-10)消息.我想做的事:每隔10秒向DOM添加一条消息.

我最终得到的代码:

$.each(messages, function(idx, el){
  window.setTimeout(function(){
    doSomething(el);
  },Math.floor(idx+1)*10000);
});
Run Code Online (Sandbox Code Playgroud)

基本上,将超时视为脚本的"时间轴".

这就是我们想要编写的代码:

DoSomething();
WaitAndDoNothing(5000);
DoSomethingOther();
WaitAndDoNothing(5000);
DoEvenMore();
Run Code Online (Sandbox Code Playgroud)

这就是我们如何告诉JAVASCRIPT:

At Runtime 0    : DoSomething();
At Runtime 5000 : DoSomethingOther();
At Runtime 10000: DoEvenMore();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Nic*_*gen 12

如果您对ES2017没问题,那就await很好:

const DEF_DELAY = 1000;

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms || DEF_DELAY));
}

await sleep(100);
Run Code Online (Sandbox Code Playgroud)

请注意,该await部分需要处于异步函数中:

//IIAFE (immediately invoked async function expression)
(async()=>{
  //Do some stuff
  await sleep(100);
  //Do some more stuff
})()
Run Code Online (Sandbox Code Playgroud)