2013-05-08 107 views
-1

我是新来的JavaScript的来自Java,我试图实现一个sleep(millis)函数。基本上我需要向一个端点发出请求,如果它返回一个错误,请稍等一会再发出请求...使用Javascript的睡眠功能

我发现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; 
    } 
    } 
} 

随着这个功能我实现了我想要的,但我知道它可能不是正确的方法,我没有找到任何其他解决方案所以,我想知道,在你看来,这是:

  • 一个完全有效的解决方案?
  • 一个不错的解决方法?
  • 对你的眼睛只是痛苦?
+1

我宁愿用'setTimeout'安排我跑比吃了CPU资源循环那样的。 – NilsH 2013-05-08 12:02:15

+1

检查此问题http://stackoverflow.com/questions/951021/what-do-i-do-if-i-want-a-javascript-version-of-sleep – 999k 2013-05-08 12:03:09

+1

您可以通过适当的方式和JavaScript方式执行此操作。向端点发出ajax请求并获取响应,像这样处理它。如果出错,请给出与'setTimeout'的参数相同的函数。否则使用你的timeoutId来清除'clearTimeout'。 – smitrp 2013-05-08 12:08:37

回答

1

在这段代码的问题是,直到代码完成是保持忙碌所有的时间。这可能会在许多浏览器中导致警告对话框,并且还会降低页面的速度。

The dialog

在这里,我还是宁愿使用setTimeout功能。语法很简单:

setTimeout("codeToBeExecuted()", milliseconds); 

可以通过保存的代码在一个函数睡觉后,并通过在全局变量所需要的数据或像这样简化它:

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

JSFiddle

1

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

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

(假设你想创建一个重复的时间表,如果没有,打电话给你的其他功能,而不是myFunc再次)。

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

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

关于您的解决方案,我选择选项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