REPL(交互式解释器)

  • 读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
  • 执行 - 执行输入的数据结构
  • 打印 - 输出结果
  • 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

    REPL命令

  • **ctrl + c**- 退出当前终端。

  • **ctrl + c **按下两次 - 退出 Node REPL。
  • **ctrl + d** - 退出 Node REPL.
  • 向上/向下 键 - 查看输入的历史命令
  • tab 键 - 列出当前命令
  • **.help** - 列出使用命令
  • **.break** - 退出多行表达式
  • **.clear** - 退出多行表达式
  • **.save _filename_** - 保存当前的 Node REPL 会话到指定文件
  • **.load _filename_** - 载入当前 Node REPL 会话的文件内容。

    回调函数

    Node.js异步编程的直接体现就是回调

阻塞代码实例

创建一个文件input.txt

  1. 菜鸟教程官网地址:www.runoob.com

创建main.js文件

  1. var fs = require("fs");
  2. var data = fs.readFileSync('input.txt');
  3. console.log(data.toString());
  4. console.log("程序执行结束!");

最后执行结果为

  1. $ node main.js
  2. 菜鸟教程官网地址:www.runoob.com
  3. 程序执行结束!

非阻塞代码实例

创建一个文件input.txt

  1. 菜鸟教程官网地址:www.runoob.com

创建main.js文件

  1. var fs = require("fs");
  2. fs.readFile('input.txt', function (err, data) {
  3. if (err) return console.error(err);
  4. console.log(data.toString());
  5. });
  6. console.log("程序执行结束!");

最后执行结果为

  1. $ node main.js
  2. 程序执行结束!
  3. 菜鸟教程官网地址:www.runoob.com

第一个实例在文件读取完后才执行程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。
因此,阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

事件循环

Node.js 是单进程单线程应用程序
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
Node.js - 图1

Node.js如何工作的

执行异步操作的函数将回调函数作为最后一个参数,回调函数接收错误对象作为第一个参数

EventEmitter 事件触发器