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')//引入fslet 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(){}) * nfs.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(){}) * nfs.readFile('文件名',{flag:'r',encoding:'..'},function(err,data){if(err){console.log(err)}else{sconsole.log(data)ee.emit('你想触发的时间名(上面定义的)')}})
