【发布时间】:2017-07-08 05:03:49
【问题描述】:
我认为我对 setTimeout 在 JavaScript 中的作用存在误解。我有这个脚本:
function recursiveFibonacci(n) {
if ( n === 0 ) {
return 1;
} else if ( n === 1 ) {
return 1;
} else {
return recursiveFibonacci(n-1) + recursiveFibonacci(n-2);
}
}
setTimeout( () => {console.log("one second");}, 1000);
console.log(recursiveFibonacci(42));
我预计会发生的是,recursiveFibonacci 在斐波那契数列的第 43 个值处开始运行。这在我的电脑上大约需要 4 秒。因此,在工作 1 秒后,评估将被中断,控制台将记录:
one second
然后大约 3 秒后登录:
433494437
相反,4 秒后,控制台会记录:
433494437
one second
一下子。为什么会这样?我怎样才能让setTimeout 工作? JavaScript 解释器是否实际上并没有被setTimeout 中断,而是如果它完成了其他工作,那么它会等到给定的时间过去后才调用给定的函数?
编辑:
我发现这个工具对于理解相关概念非常有用:
【问题讨论】:
-
setTimeout是一个函数,它将在给定的时间内与其他运行代码并行(几乎)执行命令。您似乎对延迟更感兴趣,例如$.delay()函数。是的,口译员没有被打断。 -
@Mikael,
$未在节点中定义。我要导入什么来使用它? -
jQuery.
$在 JavaScript 上下文中通常表示 jQuery,抱歉没有说得更清楚。祝你好运。 -
好的,我输入了
sudo npm install jquery,然后在 REPL 中输入了var $ = require('jquery');,然后我输入了$.delay(()=>{console.log("hi");},1000);,导致错误TypeError: $.delay is not a function。事实上,REPL 中的> $产生[Function]。 -
@SeanLetendre - Mikael 派你去追逐野鹅。
$.delay()在这里根本帮不了你,你不应该尝试在服务器上使用 jQuery 来设置计时器。这是 nodejs 如何工作的核心问题。详细解释请看我下面的回答。
标签: javascript node.js asynchronous settimeout