无法理解node.js

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

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

我在哪里可以学习基础知识以了解所有术语以及将来的node.js?

谢谢!


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

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

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

  • 事件是我们感兴趣的资源发生变化 - 我们的TCP连接收到一些数据,文件删除完成或用户单击按钮。
  • 异步调用告诉操作系统或运行时我们有兴趣用资源做某件事。 它们是非阻塞的 - 我们的程序可以在等待资源更改的同时处理其他事情。
  • 回调函数是在资源更改时执行的函数。 异步资源调用通常会接受一个或多个对回调函数的引用(一个用于成功,一个用于错误等)。 资源更改时,运行时将调用适当的回调。
  • 通过使用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是异步的,所以不可能告诉我们是否会首先看到“重命名完成”或“重命名后的步骤”消息。 这是事件驱动/异步编程的缺点 - 如果我们有一组复杂的相互依赖的任务,我们需要非常小心地确保依赖任务在依赖它们的任务之前完成。 异步调用完成顺序可能会改变的事实可能会导致非常微妙的错误。

    也可以看看:

  • 一个事件驱动的编程教程
  • 闭包 - 更复杂的一流功能操作

  • 按照唐纳德的要求编辑:

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

  • Mac OS或Linux。 如果你对Cygwin感到满意,那也可能是一种选择,但如果你运行Windows,我发现在虚拟机中运行Linux更容易。
  • Git - 不是必需的,但它使获取代码库变得容易。
  • 一种调试你的应用程序的方法。 看到这个问题。 最初,将调试信息写入控制台可能会起作用。 最终,您需要强大的调试功能。
  • 一个想法 - 你想用node.js做什么? 如果您对其功能的概述感兴趣,请浏览其API。
  • 大多数教程都着重介绍node.js快速构建Http服务器的能力:

  • 使用Node.js(显示下载存储库,构建和安装的简单版本)
  • 游戏大厅
  • Html模板的Http服务器
  • 请记住,node.js填充了一个非常特殊的利基 - 它旨在构建网络程序。 它可能不适合其他类型的程序。


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

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

    所以像这样的工作:

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

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

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


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

    链接地址: http://www.djcxy.com/p/52647.html

    上一篇: Cannot understand node.js

    下一篇: How to PROPERLY debug node.js with node inspector?