node.js是单进程引用程序,但是因为v8引擎提供的异步回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
什么是进程?
进程就是我们系统里面运行的主要的单位;进程可以看作是一个程序,在这个程序里面又可以运行多个线程
开启进程
开启线程
初始化数据
while(true){
初始化事件列表
根据事件修改数据
根据数据去渲染页面
//我们写的js代码,其实是在这里写的,运行的
btn.onclick = function(){
document.body.style.background = 'skyblue'
console.log(123)
}
console.log(456)
}
因为要按下按钮才能触发123(123是根据事件修改数据),所以为什么是456(456是初始化事件列表时就可以了)先输出出来
所以js中大多数是以事件来进行相关的操作,也就是
node.js基本上所有的事件机制都是用设计模式中观察者模式实现
事件在什么地方经常用到?
在发送、请求数据的时候
创建 read.js
let fs = require('fs')
fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
//1.数据库查看所有的用详细信息
//2.统计年龄比例
//3.查看所有用户学校的详细信息
}
})
这里有很多事情m我们可以用函数来封装,如果都在这里写,你会写的很长很长。这时你可以用事件进行触发
- 1.是监听事件和读取
- 2.封装事件
事件的编写
let fs = require('fs')
fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
//触发事件
ctyEvent.emit('fileSuccess',data)
//1.数据库查看所有的用详细信息
//2.统计年龄比例
//3.查看所有用户学校的详细信息
}
})
let ctyEvent = {
event:{
//fileSuccess:[fn,fn,fn]//3个数据
},
on: function(eventName,eventFn){
//对exent里面的fileSuccess:[fn,fn,fn]的属性添加
if(this.event[eventName]){
//如果有,直接存放
this.event[eventName].push(eventFn)
}else{
this.event[eventName] = []
this.event[eventName].push(eventFn)
}
},
emit:function(eventName,eventMsg){//在这你要传俩个参数
if(this.event[eventName]){
this.event[eventName].forEach(itemFn => {
itemFn(eventMsg)
});
}
}
}
ctyEvent.on('fileSuccess',function(EventMsg){
console.log('1.数据库查看所有的用详细信息')
})
ctyEvent.on('fileSuccess',function(EventMsg){
console.log('2.统计年龄比例')
})
ctyEvent.on('fileSuccess',function(EventMsg){
console.log('3.查看所有用户学校的详细信息')
})
这样你就可以触发这三件事件的输出
如果以上不会写,不要紧
node给我提供了一个API用了以上原理
创建 event.js
引入事件名称 events模块
let events = require('events')
创建 eventEmitter 对象
let eventEmitter = new events.EventEmitter() //变量名称可以自定义
事件触发
eventEmitter.on()
事件全触发出来
//引入 event模块
let events = require('events')
//引入fs
let fs = require('fs')
//创建 eventEmitter 对象
let eventEmitter = new events.EventEmitter()
eventEmitter.on('hello',function(eventMsg){//事件名称可以随便起
console.log('你好')
console.log(eventMsg)
})
eventEmitter.on('hello',function(){
console.log('今天的天气如何?')
})
fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
eventEmitter.emit('hello',data)//进行一个事件的触发
}
})
封装
let fs = require('fs')
let events = require('events')
let ee = new events.EventEmitter()
function ctyReadFileEvent(path){
return new Promise(function(resolve,reject){
fs.readFile(path,{flag:'r',encoding:'utf-8'},function(err,data){
if(err){
reject(err)
}else{
resolve(data)
}
})
})
}
ctyReadFileEvent('hello.txt').then(function(){
ee.emit('hello',data)
})
ee.on('hello',function(eventMsg){//事件名称可以随便起
console.log('你好')
console.log(eventMsg)
})
ee.on('hello',function(data){
console.log('今天的天气如何?')
})
异步async
触发
async function test(){
let data = await ctyReadFileEvent('hello.txt')
ee.emit('hello',data)
}
test()
总结(fs只是显示作用,后面可以更改)
引入+自己写事件
let fs = require('fs')
let yourEvent = {
event:{...},
on:function(){...},//事件触发
emit:function(){...}
}
yourEvent.on('随便你自己定义的事件',function(){})
...//yourEvent.on('随便你自己定义的事件',function(){}) * n
fs.readFile('文件名',{flag:'r',encoding:'..'},function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
yourEvent.emit('你想触发的时间名(上面定义的)')
}
})
或者
调用封装好的函数
let fs = require('fs')
let events = require('events')
let ee = new events.EventEmitter()//变量名随便定义
ee.on('随便你自己定义的事件',function(){})
...//ee.on('随便你自己定义的事件',function(){}) * n
fs.readFile('文件名',{flag:'r',encoding:'..'},function(err,data){
if(err){
console.log(err)
}else{s
console.log(data)
ee.emit('你想触发的时间名(上面定义的)')
}
})