一尘不染

无法理解node.js

node.js

对于没有JS经验的人,您对学习Node.js有什么建议?

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

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

谢谢!


阅读 178

收藏
2020-07-07

共1个答案

一尘不染

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

想象一下,等待来自TCP连接的数据,等待操作系统删除文件,或等待用户单击按钮。如果您以逐步的方式对此进行了编程(逐步是 同步的
),那么您将沿着“执行步骤1”,“执行步骤2”,“执行步骤3”进行导航,直到您点击步骤“等待发生的事情”。此时,您的程序将停止并拒绝让步,直到它接收到数据,接收到删除确认或单击按钮为止。换句话说,调用将
阻止 程序继续进行。考虑到可能还有其他TCP连接,文件操作和UI操作需要我们注意并且不依赖于我们等待的项目,因此这效率很低。

在许多情况下,最好指示我们对资源感兴趣,并在资源更改时在分步说明之外接收通知。从您的概念列表:

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

我们可以通过使用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填补了一个非常特殊的领域-它旨在构建网络程序。对于其他类型的程序,它可能不是正确的工具。

2020-07-07