无法理解node.js

从JS经验很less的人,你推荐学习Node.js什么?

我在论坛上读了很多关于事件驱动,非阻塞,asynchronous,callback等的内容,但我不知道那是什么!

我在哪里可以学习的基本知识,以了解所有的术语和未来,node.js?

谢谢!

您提到的概念(事件驱动的,非阻塞的,asynchronous的,callback)并不特定于JavaScript,在更一般的背景下理解它们是有价值的。 他们都围绕着我们无法控制的资源优雅地处理资源。

想象一下,等待来自TCP连接的数据,等待操作系统删除文件,或等待用户点击button。 如果您按步骤编程(逐步同步 ),则可以继续巡视 – “执行步骤1”,“执行步骤2”,“执行步骤3” – 直到您按下一步“等待发生的事情”。 此时,您的程序将停止并拒绝收到数据,收到删除确认,或收到button单击。 换句话说,通话阻止程序继续。 考虑到有可能需要我们注意的其他TCP连接,文件操作和UI操作,而不依赖于我们正在等待的项目,这是相当低效的。

在很多情况下,最好是指出我们对资源感兴趣,并在资源发生变化时收到分步说明之外的通知。 从你的概念清单:

  • 事件是我们感兴趣的资源的变化 – 我们的TCP连接收到一些数据,文件删除完成,或用户点击一个button。
  • asynchronous调用告诉操作系统或运行时,我们感兴趣的是用资源做某事。 它们是非阻塞的 – 我们的程序可以在等待资源更改的时候处理其他事情。
  • callback函数是在资源发生变化时执行的函数。 asynchronous资源调用通常会接受一个或多个对callback函数的引用(一个用于成功,一个用于错误等)。 资源更改时,运行时将调用相应的callback。

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

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是asynchronous的,所以不可能告诉我们是否会先看到“重命名完成”或“重命名后的步骤”。 这是事件驱动/asynchronous编程的缺点 – 如果我们有一套复杂的相互依赖的任务,我们需要非常小心,确保依赖任务在依赖于他们的任务之前完成。 asynchronous调用顺序的改变可能会导致非常微妙的错误。

也可以看看:

  • 一个事件驱动的编程教程
  • closures – 更复杂的操作一stream的function

按照唐纳德的要求编辑:

了解node.js的最好方法是下载,构build,安装和使用它。 你需要:

  • Mac OS或Linux。 如果您对Cygwin感到满意,那也可能是一个select,但是如果您运行的是Windows,我发现在虚拟机中运行Linux更容易。
  • Git – 不是必需的,但它使获取代码库变得容易。
  • 一种debugging你的应用程序的方法。 看到这个问题 。 最初,编写debugging信息到控制台可能工作。 最终,你会需要健壮的debugging。
  • 一个想法 – 你想用node.js做什么? 如果您对其function有所了解,请浏览其API 。

大多数教程都着重介绍node.js快速构buildHttp服务器的能力:

  • 去Node.js (显示下载存储库,构build和安装的简单版本)
  • 游戏大厅
  • Html模板的Http服务器

请记住,node.js填补了一个非常特殊的利基 – 它的目的是build立networking程序。 它可能不是其他types的程序的正确工具。

你需要理解的Node.js的基本概念是事件,事件发生器和事件监听器。

在Node中,大部分可以调用的函数都是非阻塞的。 例如,当您调用fs.ReadStream()时,它将返回一个ReadableStream对象。 该对象是一个EventEmitter,所以为了对stream的内容做任何事情,您需要将一个侦听器附加到该对象上,这是一个在发生特定事件时被调用的函数。

所以这样的工作:

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

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

有趣的是,一旦没有更多的数据要从文件读取,脚本退出。 只要有一个连接到发射器的有效事件侦听器,或者另一个asynchronouscallback(如定时器)处于活动状态,节点只能保持运行。

«Javascript:好的部分»是有史以来最好的书籍之一,学习语言的来龙去脉,而不仅仅是DOM的东西。

那么,这个Stackoverflow的问题有很多awnsers,它会教你更多关于学习JS。

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

JavaScript的基础知识实际上和任何其他语言(hello world app等)基本相同,真正的区别在于JavaScript的“高级”领域。