node.js是单进程引用程序,但是因为v8引擎提供的异步回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
什么是进程?

进程就是我们系统里面运行的主要的单位;进程可以看作是一个程序,在这个程序里面又可以运行多个线程

  1. 开启进程
  2. 开启线程
  3. 初始化数据
  4. while(true){
  5. 初始化事件列表
  6. 根据事件修改数据
  7. 根据数据去渲染页面
  8. //我们写的js代码,其实是在这里写的,运行的
  9. btn.onclick = function(){
  10. document.body.style.background = 'skyblue'
  11. console.log(123)
  12. }
  13. console.log(456)
  14. }

因为要按下按钮才能触发123(123是根据事件修改数据),所以为什么是456(456是初始化事件列表时就可以了)先输出出来

所以js中大多数是以事件来进行相关的操作,也就是
node.js基本上所有的事件机制都是用设计模式中观察者模式实现

事件在什么地方经常用到?

在发送、请求数据的时候

创建 read.js

  1. let fs = require('fs')
  2. fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
  3. if(err){
  4. console.log(err)
  5. }else{
  6. console.log(data)
  7. //1.数据库查看所有的用详细信息
  8. //2.统计年龄比例
  9. //3.查看所有用户学校的详细信息
  10. }
  11. })

这里有很多事情m我们可以用函数来封装,如果都在这里写,你会写的很长很长。这时你可以用事件进行触发

  • 1.是监听事件和读取
  • 2.封装事件

事件的编写

  1. let fs = require('fs')
  2. fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
  3. if(err){
  4. console.log(err)
  5. }else{
  6. console.log(data)
  7. //触发事件
  8. ctyEvent.emit('fileSuccess',data)
  9. //1.数据库查看所有的用详细信息
  10. //2.统计年龄比例
  11. //3.查看所有用户学校的详细信息
  12. }
  13. })
  14. let ctyEvent = {
  15. event:{
  16. //fileSuccess:[fn,fn,fn]//3个数据
  17. },
  18. on: function(eventName,eventFn){
  19. //对exent里面的fileSuccess:[fn,fn,fn]的属性添加
  20. if(this.event[eventName]){
  21. //如果有,直接存放
  22. this.event[eventName].push(eventFn)
  23. }else{
  24. this.event[eventName] = []
  25. this.event[eventName].push(eventFn)
  26. }
  27. },
  28. emit:function(eventName,eventMsg){//在这你要传俩个参数
  29. if(this.event[eventName]){
  30. this.event[eventName].forEach(itemFn => {
  31. itemFn(eventMsg)
  32. });
  33. }
  34. }
  35. }
  36. ctyEvent.on('fileSuccess',function(EventMsg){
  37. console.log('1.数据库查看所有的用详细信息')
  38. })
  39. ctyEvent.on('fileSuccess',function(EventMsg){
  40. console.log('2.统计年龄比例')
  41. })
  42. ctyEvent.on('fileSuccess',function(EventMsg){
  43. console.log('3.查看所有用户学校的详细信息')
  44. })

这样你就可以触发这三件事件的输出

如果以上不会写,不要紧

node给我提供了一个API用了以上原理

创建 event.js

引入事件名称 events模块
  1. let events = require('events')

创建 eventEmitter 对象
  1. let eventEmitter = new events.EventEmitter() //变量名称可以自定义

事件触发
  1. eventEmitter.on()

事件全触发出来
  1. //引入 event模块
  2. let events = require('events')
  3. //引入fs
  4. let fs = require('fs')
  5. //创建 eventEmitter 对象
  6. let eventEmitter = new events.EventEmitter()
  7. eventEmitter.on('hello',function(eventMsg){//事件名称可以随便起
  8. console.log('你好')
  9. console.log(eventMsg)
  10. })
  11. eventEmitter.on('hello',function(){
  12. console.log('今天的天气如何?')
  13. })
  14. fs.readFile('hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){
  15. if(err){
  16. console.log(err)
  17. }else{
  18. console.log(data)
  19. eventEmitter.emit('hello',data)//进行一个事件的触发
  20. }
  21. })

封装
  1. let fs = require('fs')
  2. let events = require('events')
  3. let ee = new events.EventEmitter()
  4. function ctyReadFileEvent(path){
  5. return new Promise(function(resolve,reject){
  6. fs.readFile(path,{flag:'r',encoding:'utf-8'},function(err,data){
  7. if(err){
  8. reject(err)
  9. }else{
  10. resolve(data)
  11. }
  12. })
  13. })
  14. }
  15. ctyReadFileEvent('hello.txt').then(function(){
  16. ee.emit('hello',data)
  17. })
  18. ee.on('hello',function(eventMsg){//事件名称可以随便起
  19. console.log('你好')
  20. console.log(eventMsg)
  21. })
  22. ee.on('hello',function(data){
  23. console.log('今天的天气如何?')
  24. })

异步async触发
  1. async function test(){
  2. let data = await ctyReadFileEvent('hello.txt')
  3. ee.emit('hello',data)
  4. }
  5. test()

总结(fs只是显示作用,后面可以更改)

引入+自己写事件

  1. let fs = require('fs')
  2. let yourEvent = {
  3. event:{...},
  4. on:function(){...},//事件触发
  5. emit:function(){...}
  6. }
  7. yourEvent.on('随便你自己定义的事件',function(){})
  8. ...//yourEvent.on('随便你自己定义的事件',function(){}) * n
  9. fs.readFile('文件名',{flag:'r',encoding:'..'},function(err,data){
  10. if(err){
  11. console.log(err)
  12. }else{
  13. console.log(data)
  14. yourEvent.emit('你想触发的时间名(上面定义的)')
  15. }
  16. })

或者

调用封装好的函数

  1. let fs = require('fs')
  2. let events = require('events')
  3. let ee = new events.EventEmitter()//变量名随便定义
  4. ee.on('随便你自己定义的事件',function(){})
  5. ...//ee.on('随便你自己定义的事件',function(){}) * n
  6. fs.readFile('文件名',{flag:'r',encoding:'..'},function(err,data){
  7. if(err){
  8. console.log(err)
  9. }else{s
  10. console.log(data)
  11. ee.emit('你想触发的时间名(上面定义的)')
  12. }
  13. })