Javascript中的睡眠功能

时间:2013-05-08 11:58:41

标签: javascript sleep

我是Java的 JavaScript 新手,我正在尝试实现sleep(millis)功能。基本上我需要向端点发出请求,如果它返回错误,请等待一段时间再次发出请求......

我找到了JavaScript的setTimeout()函数,但它有一个奇怪的(对我来说)行为,因为它似乎代码仍在运行,我不想要做什么,但等待......

经过一番研究后,我发现了这个功能here

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

通过这个功能,我可以完全达到我想要的效果,但我知道它可能不是正确的方法,而且我没有找到这样的任何其他解决方案......所以,我喜欢在您看来,知道的是:

  • 一个完全有效的解决方案?
  • 一个不太糟糕的解决方法?
  • 你的眼睛痛苦吗?

4 个答案:

答案 0 :(得分:1)

嗯,意见会有所不同。我可以理解你,JavaScript没有真正的睡眠功能,如Java或任何其他语言(如Perl,Bash,PHP等)

http://devcheater.com/显示了多种变体,但也查看了这些Stackoverflow主题:

What is the JavaScript version of sleep()? What's the best way to implement a sleep function JavaScript? How to make a REAL sleep() in JavaScript?

答案 1 :(得分:1)

此代码中的问题是在代码完成之前始终保持忙碌状态。这可能会导致许多浏览器出现警告对话框,并且还会降低页面速度。

The dialog

在这里,我仍然希望使用setTimeout功能。语法非常简单:

setTimeout("codeToBeExecuted()", milliseconds);

您可以通过在函数中休眠后保存代码并在全局变量中传递所需数据来简化它,或者像这样:

setTimeout('whenDone(' + numericData + ', "' + stringData + '")', milliseconds);

JSFiddle

答案 2 :(得分:1)

你说你不喜欢setTimeout,但基本上,这就是你需要做的。

function myFunc() {
    // Do the work
    setTimeout(myFunc, sleepInterval);
}

(假设您正在尝试创建重复计划,如果没有,请再次调用您的其他功能而不是myFunc。)

你可以(也可能应该)添加一些终止逻辑。

然后使用myFunc()开始工作。您也可以使用setInterval,但如果您的间隔开始重叠,则可能会导致一些问题。

关于您的解决方案,我选择选项3 ...

答案 3 :(得分:1)

Javascript中没有sleep函数,您应该考虑使用window.setTimeout来调用下一个操作。我当然不会在for循环中刻录循环。但是如果你必须将它包装在一个名为sleep的函数中,那么这里就是一个给你一个想法的例子。

function sleep(callBack, milliSecs) {
    setTimeout(callBack, milliSecs);
}


function first() {
    console.log("first");
}

function second() {
    console.log("second");
}

first();
sleep(second, 5000);

jsfiddle