关于javascript:无法理解node.js

Cannot understand node.js

从一个在JS方面经验不足的人那里,您对学习node.js有什么建议?

我在论坛上读了很多关于事件驱动、非阻塞、异步、回调等的文章,但我不知道这是什么!

在哪里可以学习基础知识,以便理解所有这些术语以及将来的node.js?

谢谢!


您提到的概念(事件驱动、非阻塞、异步、回调)并不特定于JavaScript,在更一般的上下文中理解它们是有价值的。他们都在优雅地处理我们无法控制的资源。

想象一下,等待来自TCP连接的数据,等待操作系统删除文件,或者等待用户单击按钮。如果你一步一步地对它进行编程(一步一步是同步的),你将沿着"做第一步"、"做第二步"、"做第三步"巡航,直到你点击"等待事情发生"。此时,程序将停止并拒绝更改,直到它收到数据、收到删除确认或收到按钮单击。换句话说,调用会阻止程序继续进行。考虑到可能还有其他TCP连接、文件操作和UI操作需要我们注意,而且不依赖于我们正在等待的项目,这是非常低效的。

在许多情况下,当资源发生变化时,最好指出我们对某个资源感兴趣,并在逐步指令之外接收通知。从您的概念列表中:

  • 事件是我们感兴趣的资源的变化——我们的TCP连接接收到一些数据,文件删除完成,或者用户单击了一个按钮。
  • 异步调用告诉操作系统或运行时我们有兴趣对资源做一些事情。它们是非阻塞的——我们的程序可以在等待资源变化的同时处理其他事情。
  • 回调是资源更改时要执行的函数。异步资源调用通常接受一个或多个对回调函数的引用(一个用于成功,一个用于错误等)。当资源更改时,运行时调用适当的回调。

通过使用node.js重命名文件,我们可以看到这些概念:

1
2
3
4
5
6
7
8
9
var fs = require('fs');

// args (current file name, new file name, callback function)
fs.rename('/tmp/hello', '/tmp/world', function (err) {
  // this occurs when the rename is complete
  if (err) throw err;
  console.log('rename complete');
});
console.log('step after rename');

第三个论点可能看起来很奇怪。这是一个未命名(匿名)函数,重命名完成后将调用该函数。

请注意,由于fs.rename是异步的,所以我们不可能首先看到"Rename Complete"或"Step After Rename"消息。这是事件驱动/异步编程的缺点——如果我们有一组复杂的相互依赖的任务,我们需要非常小心地确保依赖的任务在依赖它们的任务之前完成。异步调用完成的顺序可能会改变,这一事实可能导致非常细微的错误。

参见:

  • 事件驱动编程教程
  • 闭包-更复杂的一级函数操作

根据唐纳德的要求编辑:

理解node.js的最佳方法是下载、构建、安装和使用它。你需要:

  • Mac OS或Linux。如果您对Cygwin感到满意,这可能也是一个选项,但是如果您运行的是Windows,我发现在虚拟机中运行Linux更容易。
  • 不需要Git,但它使获取代码存储库变得容易。
  • 调试应用程序的方法。看看这个问题。最初,将调试信息写入控制台可能有效。最终,您将需要健壮的调试。
  • 一个想法-你想用node.js做什么?如果您对它的功能有兴趣,请浏览它的API。

大多数教程都关注node.js快速构建HTTP服务器的能力:

  • 使用node.js进行事件处理(显示下载存储库、构建和安装的简单版本)
  • 游戏大厅
  • 具有HTML模板的HTTP服务器

请记住node.js填补了一个非常特殊的领域——它是为构建网络程序而设计的。它可能不是其他类型程序的正确工具。


要使用node.js取得进展,您需要了解的基本概念是事件、事件发射器和事件侦听器的概念。

在节点中,可以调用的大多数函数都是非阻塞的。例如,当调用fs.readstream()时,它返回一个readablestream对象。该对象是一个EventEmitter,因此为了对流的内容进行任何操作,您需要将侦听器附加到该对象,该对象是一个函数,在发生特定事件时会被调用。

所以像这样的工作:

1
2
3
4
5
var fs=require('fs');
var stream = fs.createReadStream("/var/log/messages", { 'flags':'r' });
stream.addListener('data', function(someData) {
        console.log(someData);
});

这将读取给定文件中的所有文本,并将其写入控制台。当有数据要从流中读取时,将调用函数,并从文件中传递数据。

有趣的是,一旦没有更多的数据可以从文件中读取,脚本就会退出。只要发射器上有一个有效的事件侦听器,或者另一个异步回调(如计时器)处于活动状态,节点就只保持运行。


?javascript:好的部分?是有史以来最好的学习语言的书籍之一,而不仅仅是DOM的东西。


好吧,这个stackoverflow问题中有很多关于学习JS的知识。

https://stackoverflow.com/questions/3696199/how-can-i-really-master-javascript/3696765 3696765

JavaScript基础实际上与任何其他语言(Hello World应用程序等)都是相同的基础,真正的区别在于JavaScript的"高级"区域。