Simple Node.js示例不适用于Windows 7

Simple Node.js示例不适用于Windows 7,node.js,Node.js,我正在看一些node js的演示 setInterval(function(){ console.log('world'); }, 2000); console.log('hello'); 我已经安装了node js for Windows,当我按照指令在命令提示符下定期运行它时,它会打印hello,然后打印world,但在这个时间间隔内,我无法执行任何操作。我是否遗漏了Windows 7中的某些内容我认为您误解了setInterval的功能。它是一个阻塞函数,等待指定的超时(在您的

我正在看一些node js的演示

setInterval(function(){
    console.log('world');
}, 2000);

console.log('hello');

我已经安装了node js for Windows,当我按照指令在命令提示符下定期运行它时,它会打印hello,然后打印world,但在这个时间间隔内,我无法执行任何操作。我是否遗漏了Windows 7中的某些内容

我认为您误解了
setInterval
的功能。它是一个阻塞函数,等待指定的超时(在您的情况下为2000ms),然后在超时后执行包含的函数

因为Node.js是非阻塞的(这意味着它在一个异步流中执行整个代码块),所以它将在打印第一个
世界之前打印
hello

解释:

setInterval(function(){
    console.log('world');
    // 2. This prints out after 2 seconds, and prints again every 2 seconds
}, 2000);

console.log('hello');
// 1. This prints out

简而言之,您看到的是预期结果。

您误解了本教程的内容。当教程说“进程处于空闲状态而不是睡眠状态,因此我们可以在该时间间隔内执行操作”时,并不意味着进程在后台运行;它只是意味着进程本身可以在这两秒钟内完成很多事情,而不像“sleep”命令那样会阻塞并等待

在后台运行是完全不同的事情,它独立于进程本身的工作方式。这取决于你身上的外壳。在UNIX中,通过键入
进程参数&
&
很重要),您可以运行任何进程(无论它是非阻塞节点还是阻塞等待或其他)。但是Windows命令提示符没有这个功能(您可以得到的最接近的功能是
start node script.js
,它在新窗口中运行它,并立即返回上一个窗口中的提示符


注意,它的工作原理与预期完全一致。

我认为您的问题在于理解“所以我们可以做事情”的含义。setInterval设置了一个计时器,以便在每次计时器启动时调用指定的函数

在给出的示例中,计时器为每2秒一次。这意味着您可以在node.js中进行其他操作,而计时器正在倒计时。但是,在node.js中,只有一个线程,因此一次只能执行一个操作。计时器只提供了这样一种功能,即,当此时间结束时,在没有其他操作的情况下进行操作

例如,您可以在计时器倒计时时处理网络请求,可以读取文件内容,可以解析一些xml,等等

我编写的代码使用计时器来检查一组数据是否脏。如果脏了,那么它会将更改传输到所有其他客户端。我在套接字上有一个侦听器,可以从连接的无人机接收遥测。如果我关心遥测,那么我会更新数据。因此,我可以在一分钟内多次更新数据,而只需执行chec如果我需要每分钟发送一次更新,那么当setInterval设置了每分钟一次的重复计时器时,当计时器的函数没有被执行时,node.js可以处理来自套接字上侦听器的任何事件


但是,请注意,如果您在计时器启动期间执行某项操作,则it node.js必须等到您完成后才能让计时器功能执行。

您所说的“无法执行任何操作”是什么意思?@herby根据Ryan Dahl的tuto,进程处于理想状态,而不是睡眠状态,因此我们可以在该时间间隔内做一些事情,比如在cmd提示符上,在这些时间间隔内可以键入一些随机文本。或者我没有理解他的意思吗?如果您像
c:\node server.js
那样运行,那么您正在运行代码,时间间隔如下所示ync,但你不能在命令行上键入?@adeneo是的,我像C:\node D:\server.js一样运行DOS窗口会被阻止,这与node.js的异步性质无关,它与Windows如何执行程序有关。进程处于理想状态,而不是休眠状态,因此我们可以在该interv内执行操作在这个例子中,在这些时间间隔内,al在cmd提示符上可以输入一些随机文本。或者我没有理解他的意思吗?我不知道那句话的意思,只是因为
setInterval
正在阻塞(它停止线程)你不能做任何事情。你可以设置一系列其他的事情来运行,比如进行API调用,或者其他一些事情,这样当API调用异步完成时,脚本的其余部分可以继续运行。@更确切地说,它会停止函数,而不是线程。对不起,如果在
console.log('world')之后要编写其他东西的话;
,它在之后才会出现;而
console.log('hello'));
发生在setInterval之外。我们需要开始吗,我认为node script.js是enough@brykneval-简单地说,答案是,您所做的是异步的,并且在节点内它不会阻塞线程,您可以在.js文件中执行其他操作,但这与使用命令l在窗口中执行更多操作不同ine,因为这与节点无关,由操作系统控制。是的,当然,这就足够了。只是您希望它在后台运行。您可以使用
start
或多或少地获取它。但它当然不会改变代码的含义,只是改变您运行它的模式。您不明白吗?我提到过
start
I在关于在后台运行的段落中,它与实际的node.js或脚本的代码无关。如果让您感到困惑,我是否应该完全删除它?