JavaScript sleep
是的,我知道-那个问题有成千上万的答案。请不要告诉我关于
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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; } |
如果你知道如何使用
但我还是找不到实施它的有效例子。
问题是如何在javascript中实现
1 2 3 4 5 | function sleep(ms) { var start = new Date().getTime(), expire = start + ms; while (new Date().getTime() < expire) { } return; } |
我只是这样测试它:
1 2 3 | console.log('hello'); sleep(5000); console.log('world'); |
为我工作。
(作为元注释:我在这里登陆是因为我特别需要这个函数。当您在等待值时需要阻塞时,就会出现这种需求。即使是在javascript中。)
我不完全理解你的要求,但我会回答这部分:
if you know how to get the same result
using setTimeout - tell me
基本的区别是,
1 2 3 | fibonacci(7, function(result) { // use the result here.. }); |
因此,在实施方面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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); } |
我还想指出,不,这并不是比使用
有利的一面?它允许您编写性能优于同步算法的非阻塞算法。如果您以前没有听说过node.js,您可以查看它来进一步了解它的好处。(许多其他语言也有处理异步IO的库,但只要谈论的是JavaScript….)
在浏览器(或任何其他GUI环境)中,
在Web浏览器中,几乎所有东西都是这样工作的。鼠标点击/悬停/etc函数是事件触发器。Ajax请求不会等待服务器的响应;它们会设置一个事件,在收到响应时触发。
基于时间的操作也可以使用事件触发器,使用诸如
就是这样做的。事实上,这是在几乎所有编写良好的GUI应用程序中都可以做到的,因为所有的GUI接口都必须能够对事件(如鼠标单击)做出即时响应。
一个javascript
江户一〔3〕是前进的道路。总是有一种方法可以做到这一点;产生的代码可能不像示例代码那样整洁和线性,但是事件驱动代码很少是线性的——它不可能是线性的。解决方案是将流程分解为小函数。甚至可以将后续函数嵌入到
希望能帮你解释一下。
只需使用一个没有循环或递归的更好的算法,并避免需要
1 2 3 | function fibonacci(n) { return Math.round(Math.pow((Math.sqrt(5) + 1) / 2, Math.abs(n)) / Math.sqrt(5)) * (n < 0 && n % 2 ? -1 : 1); } |
使用实例:
1 2 3 4 | // Log the first 10 Fibonacci numbers (F0 to F9) to the console for (var i = 0; i < 10; i++) { console.log(fibonacci(i)); } |
你到底为什么要在计算任何东西的时候"睡觉"?在任何语言中,睡觉几乎总是一个坏主意。它本质上告诉线程在这段时间内停止做任何事情。
所以,在一种只有一个线程的语言(忘记"web workers")中,暂停所有计算会有什么好处?这是个坏主意,算了吧。
现在谈谈你写的问题,尽管我不认为这是你真正的问题。在计算这个序列时,为什么要暂停一秒钟?即使要计算序列中的前6个数字,也需要8秒左右的时间。为什么?在递归调用之间暂停一秒钟的可能原因是什么?住手。除去它。
如果您只想在完成后一秒钟生成最终结果,那么在函数中使用setTimeout会以某种方式使用答案。
1 2 3 4 5 6 7 8 | function fib(n) { ... result = fib(); ... setTimeout(function() { console.log("Fib for" + n +" is" + result); },1000); } |
不要试图实现"睡眠"。不要在计算过程中暂停。