-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnodejsTest.js
More file actions
195 lines (160 loc) · 7.41 KB
/
nodejsTest.js
File metadata and controls
195 lines (160 loc) · 7.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
//this is nodejs test
"use strict";
// var modul = require("./hello2");
// var name = "qing";
// modul.get(name);
function main () {
console.log("main");
//globalVar();
serverTest();
asyncTest();
inheritsTest();
bufferTest();
}
function globalVar () {
//js在浏览器中有且仅有一个全局window对象。而在Node.js环境中,也有唯一的全局对象global
//__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径
//__dirname 表示当前执行脚本所在的目录
// setTimeout(cb, ms) 全指定的毫秒(ms)数后执行指定函数(cb)。只执行一次指定函数。返回一个代表定时器的句柄值。
// setInterval(cb, ms) 同上,会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
//clearTimeout( t ) 用于停止一个之前创建的定时器
//console.time("获取数据"); ... console.timeEnd('获取数据'); 获取数据:1ms
//process
// for ( var k in global) {
// console.log(k+" "+global[k]);
// }
console.log(global.console);
//Node.js进程
console.log("Node.js进程");
console.log(global.process); //true
}
//简单web服务
function serverTest () {
var http = require("http");
var server = http.createServer(function (req,res) {
// 获得HTTP请求的method和url:
console.log(request.method + ': ' + request.url);
res.writeHead(200,{"Content-Type":"text/plain"});
res.end("hello node");
});
server.listen(1337,"127.0.0.1");
console.log("server running at http://127.0.0.1");
}
//异步 非阻塞编程
function asyncTest () {
//Node.js 异步编程依托于回调来实现,这样在执行代码时就没有阻塞或等待文件 I/O 操作。
//这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
var fs = require("fs");
//阻塞代码 同步读取
// var data = fs.readFileSync('test.txt');
// console.log(data.toString());
// console.log("程序执行结束!");
//非阻塞代码 异步读取
fs.readFile('test.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
}
//事件循环
function eventTest () {
//Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
//Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
//Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
//Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
//Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
//当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
//这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
//在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
// on(event, listener)
// 为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
// once(event, listener)
// 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
// addListener(event, listener)
// 为指定事件添加一个监听器到监听器数组的尾部。
// removeListener(event, listener)
// 移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器
// removeAllListeners([event])
// 移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
// setMaxListeners(n)
// 默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量
// listeners(event)
// 返回指定事件的监听器数组
// emit(event, [arg1], [arg2], [...])
// 按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 绑定 connection 事件处理程序
eventEmitter.on('connection', listner1 );
// 创建事件处理程序 (监听器)
var listner1 = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received' ,'qingsen'); //'qingsen' data_received事件函数参数
}
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(name){
console.log('数据接收成功。' + name);
});
// 触发 connection 事件 eventEmitter.emit('eventName');
//延迟1000 毫秒以后向 eventEmitter 对象发送事件 connection,此时会调用 connection 的监听器
var t = setTimeout(function() { //返回一个代表定时器的句柄值
eventEmitter.emit('connection');
}, 1000);
//对象方法:
// addListener(event, listener) on(event, listener) once(event, listener)
// removeListener(event, listener) removeAllListeners([event])
// setMaxListeners(n) 默认监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
// listeners(event) 返回指定事件的监听器数组。
// emit(event, [arg1], [arg2], [...])
// 类方法 EventEmitter.listenerCount(emitter, event) 返回指定事件的监听器数量。
console.log("程序执行完毕。");
// EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
// 当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
// 我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。
}
function inheritsTest () {
var util = require('util');
function Base() {
this.name = 'base';
this.base = 1991;
this.sayHello = function() {
console.log('Hello ' + this.name);
};
}
Base.prototype.showName = function() {
console.log(this.name);
};
function Sub() {
this.name = 'sub';
}
util.inherits(Sub, Base); //Sub 仅仅继承了Base 在原型中定义的函数,而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 Sub 继承。
var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);
var objSub = new Sub();
objSub.showName();
//objSub.sayHello(); //报错,不存在该方法
console.log(objSub);
}
function bufferTest() {
//var buf = new Buffer("www.runoob.com", "utf-8"); //new Buffer([10, 20, 30, 40, 50]);
var buf = new Buffer(256);
//写入缓冲区
var len = buf.write("www.runoob.com"); //14
//从缓冲区读取数据
buf.toString('utf8',0,5) //www.r
//buf.length 返回 Buffer 对象所占据的内存长
// 剪切缓冲区
var buffer2 = buf.slice(0,2);
//缓冲区合并
//Buffer.concat(buffer1,buffer2);
}
main()
//module.exports是个空对象
module.exports = {
main: main,
init: init //字典最后一个最好不要写 逗号
}; //模块对外输出变量,可以是任意对象、函数、数组等等