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的"高级"区域。