是的,我知道 - 这个问题有成千上万的答案.请不要告诉我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;
}
Run Code Online (Sandbox Code Playgroud)
如果你知道如何使用相同的结果setTimeout- 告诉我;)fibanacci是非常容易的任务,因为不超过2次递归,但是如何进行n次递归(如fib(1)+ fib(2)+). .+ fib(n))并在每个"+"之后睡觉?不,睡觉会轻松多了.
但我仍然无法实现它的实例.while (curr - start < time) { curr = (...) }是棘手的,但它不会工作(只是停止我的浏览器,然后立即抛出所有控制台日志).
小智 33
问题是询问如何sleep()在JavaScript中实现,对吧?
function sleep(ms) {
var start = new Date().getTime(), expire = start + ms;
while (new Date().getTime() < expire) { }
return;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚测试过它:
console.log('hello');
sleep(5000);
console.log('world');
Run Code Online (Sandbox Code Playgroud)
适合我.
(作为一个元评论:我在这里登陆是因为我特别需要这个功能.当你需要在等待一个值时阻塞时,会出现这样的需求.即使在JavaScript中也是如此.)
Jak*_*kob 20
我不完全明白你在问什么,但我会回答这一部分:
如果你知道如何使用setTimeout获得相同的结果 - 告诉我
根本区别在于sleep(在许多其他语言中使用)是同步的,而setTimeout(和许多其他JavaScript概念,例如AJAX)是异步的.因此,为了重写您的功能,我们必须考虑到这一点.主要是,我们必须使用回调来获取"返回值",而不是实际的返回语句,因此它将像这样使用:
fibonacci(7, function(result) {
// use the result here..
});
Run Code Online (Sandbox Code Playgroud)
那么,至于实施:
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);
}
Run Code Online (Sandbox Code Playgroud)
我还想指出,不,这不是一个比使用更容易的解决方案sleep.为什么?因为这段代码是异步的,而且比大多数人习惯的同步代码简单得多.以这种方式开始思考需要练习.
好处?它允许您编写优于同步对应的非阻塞算法.如果您之前没有听说过Node.js,可以查看它以进一步了解它的好处.(许多其他语言也有用于处理异步IO的库,但只要谈论JavaScript ......)