JavaScript休眠
JavaScript休眠
这个问题已经在这里有答案了:
是的,我知道 - 那个问题已经有成千上万个答案了。请不要告诉我关于setTimeout
方法,因为 - 是的,用那个方法可以做到一切,但不像使用sleep()
方法那么容易。
例如:
function fibonacci(n) { console.log("Computing Fibonacci for " + n + "..."); var result = 0; //wait 1 second before computing for lower n sleep(1000); result = (n <= 1) ? 1 : (fibonacci(n - 1) + fibonacci(n - 2)); //wait 1 second before announcing the result sleep(1000); console.log("F(" + n + ") = " + result); return result; }
如果你知道如何使用setTimeout
获得相同的结果 - 告诉我;) 斐波那契数列是相当简单的任务,因为不会有超过2个递归,但是如何在每个“+”后睡眠 n-递归(例如fib(1)+ fib(2)+ .. + fib(n))?呃,sleep会容易得多。
但是,我仍然无法找到可行的实现示例。while(curr-start<time){curr=(...)}
很棘手,但它不起作用(只是停止我的浏览器,然后一次性抛出所有控制台日志)。
我不完全明白你的问题,但我会回答其中一部分:
如果你知道如何通过setTimeout获得相同的结果 - 告诉我
根本区别在于,sleep
(在许多其他语言中使用)是同步的,而setTimeout
(以及许多其他JavaScript概念,例如AJAX)是异步的。因此,为了重写您的函数,我们必须考虑这一点。主要是,我们必须使用回调来获取“返回值”,而不是实际的返回语句,因此它将像这样使用:
fibonacci(7, function(result) { // use the result here.. });
因此,对于实现:
function fibonacci(n, callback) { console.log("Computing Fibonacci for " + n + "..."); var result = 0; var announceAndReturn = function() { setTimeout(function() { // wait 1 second before announcing the result console.log("F(" + n + ") = " + result); callback(result); // "returns" the value }, 1000); }; // wait 1 second before computing lower n setTimeout(function() { if (n <= 1) { result = 1; announceAndReturn(); } else { var resultsLeft = 2; var handler = function(returned) { result += returned; resultsLeft--; if (resultLeft == 0) announceAndReturn(); } fibonacci(n-1, handler); fibonacci(n-2, handler); } }, 1000); }
我还想指出,不,这不比使用sleep
更容易。为什么?因为这段代码是异步的,对于大多数人而言,同步代码简单得多。需要实践才能开始以这种方式思考。
好处是什么?它允许你编写非阻塞算法,优于它们的同步对应物。如果你以前没有听说过Node.js,你可以去了解一下,以进一步了解其中的好处。(许多其他语言也有处理异步IO的库,但只要我们谈论JavaScript..)
这个问题是在问如何在JavaScript中实现 sleep()
函数,是吗?
function sleep(ms) { var start = new Date().getTime(), expire = start + ms; while (new Date().getTime() < expire) { } return; }
我刚刚尝试测试了一下:
console.log('hello'); sleep(5000); console.log('world');
对我来说是有效的。
(作为元注释:我来到这里是因为我有一个特殊需要这个函数的需求。当你需要阻止等待值时,这些需求确实会出现,即使在JavaScript中也是如此。)