nodejs学习笔记(上)

本文纯粹是我个人在学习node.js过程中的笔记。

node1:创建服务器

var http = require('http);//使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
http.createServer(functiom(request,response){
//发送 http 头部
//http 状态值 200 OK
//内容类型:text/plain
//response.writeHead(200,{'Content-Type':'text/plain'});
//发送响应数据
response.end('Hello World')
}).listen(8888);
//终端打印信息
console.log('Server running at http://127.0.0.1.8888/');

question 1: 
response.writeHead(200,{'Content-Type':'text/plain'});//解释这一条;

这一条表示的是服务器回应客户端,并以“text/plain”的数据类型来显示该页面,前面的‘’200‘’是状态码?

question 2:理解nodejs编程的异步性,阻塞式与非阻塞式

note 2:什么是异步、阻塞式、非阻塞式

异步性:先讲讲什么是同步,同步就是一定要等任务执行完毕才执行下一个任务,异步呢就是不等程序执行完毕,直接执行下一个任务,下面是例子

console.log(1)
setTimeout(function(){
  console.log(2)
},0)
console.log(3)

执行顺序是1-3-2:,不需要等待console.log(2)被执行出来再执行console.log(3).


阻塞式:建立一个文件名为“test.txt”内容为“this is a test file”,终端执行执行下面代码,代码我是放在server.js文件上。上一次学习用的,懒得改名字了。

var fs = require("fs");

var data = fs.readFileSync('test.txt');

console.log(data.toString());
console.log("程序执行结束!");

执行结果:

会发现程序是由上而下执行的,也就是说一条语句执行完毕才会执行下一条语句,后面的语句被前面未执行完毕的代码阻塞到了。

非阻塞式:建立一个文件名为“test.txt”,内容为“this is a test file”,终端执行执行下面代码,代码我是放在server.js文件上。

var fs = require("fs");

fs.readFile('test.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

执行结果:


可以发现,程序先打印“程序执行结束”然后打印“this is a test file”,也就是说我们不需要等待文件读取完再执行下一条,而是在读取文件的同时执行接下来的代码,就不会受到阻塞

note3:事件循环

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高,来看一个例子,本文例子大部分来自菜鸟教程:http://www.runoob.com/nodejs/nodejs-event-loop.html

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');3.接下来来到这里,触发data-received事件
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);2.接下来到这里,connection事件和connectHandler绑定在一起了。执行connectHandler
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件 
eventEmitter.emit('connection');//1.首先执行的代码,触发connection事件, 回到connection事件

console.log("程序执行完毕。");

所以以上执行结果为:

$ node main.js
连接成功。
数据接收成功。
程序执行完毕。

note3:EventEmitter

var events = require('events'); //引入event模块
var emitter = new events.EventEmitter(); //创建一个events.EventEmitter实例
emitter.on('someEvent', function(arg1, arg2) { //绑定someEvent事件。
    console.log('listener1', arg1, arg2); //注册一个事件监听listener1,带两个参数:arg1和arg2;
}); 
emitter.on('someEvent', function(arg1, arg2) { //绑定someEvent事件
console.log('listener2', arg1, arg2); //注册一个事件监听listener2,带两个参数:arg1和arg2
}); emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

EventEmitter方法

1 addListener(event, listener)
为指定事件添加一个监听器到监听器数组的尾部。
2 on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) {
  console.log('someone connected!');
});
3 once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
server.once('connection', function (stream) {
  console.log('Ah, we have our first user!');
});
4 removeListener(event, listener)

移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

它接受两个参数,第一个是事件名称,第二个是回调函数名称。

var callback = function(stream) {
  console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
5 removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
6 setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
7 listeners(event)
返回指定事件的监听器数组。
8 emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。

类方法

序号 方法 & 描述
1 listenerCount(emitter, event)
返回指定事件的监听器数量。

事件

序号 事件 & 描述
1 newListener
  • event - 字符串,事件名称

  • listener - 处理事件函数

该事件在添加新监听器时被触发。

2 removeListener
  • event - 字符串,事件名称

  • listener - 处理事件函数

从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。




猜你喜欢

转载自blog.csdn.net/ymwwow/article/details/79530594