NodeJS相关笔记(三)

1.mvc
◆mvc原本是后端的,一个分层的概念,后来前端的技术偷换过去了,和后端有很大的区别,只是做了一个分层,angular是mvc模型的一个进化。


2.mvvm模型
◆后端的mvc,大多是靠controller,而前端的mvc大多是靠model和view,所以衍生出了mvvm,model、 view 、viewmodel($scope,他的作用性远大于controller,把控制器层给遮住了)。


2.angularjs双向绑定,监听了页面的元素,同时也监听了$scope,所以才可以实现双向绑定,angularjs内部的机制,使用$scope.$watch【
// 初始化数据模型
$scope.name=1;
// 监视数据模型的变化
// 第一个参数,数据模型名的字符串形式
 // 第二个参数,是一个回调函数:有两个参数,分别是变化后的值,和变化前的值
$scope.$watch('name',function(nowValue,oldValue){
                     $scope.name=$scope.name+1;
                   console.log(nowValue);
                  console.log(oldValue);
             })



3.angular中的定时器
◆$interval(),使用方式和setInterval()一样。
◆但是如果你单独使用setInterval(),然后在里面修改$scope的值,那么一定要使用$scope.$apply(),不然就没有效果,因为$interval()内部调用了$scope.$apply()的。
◆不在AngularJS的控制范围内去修改$scope里的值,需要手动去调用$scope.$apply()。


4.IO与并发
◆大量的IO操作叫做高IO,IO就是读写文件,数据的流动。
◆使用nodejs,普通的电脑可以响应千级别的并发,短暂的时间段内有几个程序都处于运行开始到运行完毕之间。


5.进程与线程
◆进程是为运行当中的应用程序提供运行环境的,一个运行当中的应用程序就会有一个进程与之相对应。
◆线程是用来运行应用程序中代码的,一个线程在一个时间只能做一件事件,多线程就是多个线程同时在工作,其实就是快速的切换,但是调度起来很麻烦,node是单线程执行,使用了异步替代多线程,事件环机制。


6.异步与同步:
◆ajax
◆setTimeout
◆setInterval
◆同步代码会阻塞主线程,所以你如果不开启一个线程来执行异步代码,那么异步代码再牛,都会先执行同步代码然后再执行异步代码。
◆异步代码会放到一个队列里,先执行同步代码,然后再执行异步代码,所以所有的异步代码都会被同步代码阻塞。



7.异步非i/o操作和异步i/o操作
◆异步非io: setTimeout setInterval,异步的代码会被放入队列,等同步全部执行完毕,再从队列中去,这时候异步代码也就相当于同步代码了。
◆异步IO操作: 操作文件 网络操作 fs
◆异步IO操作不会阻塞,原理是因为nodejs底层还是多线程的,虽然表面是单线程的,例如对IO操作会开新线程,其它无关IO的callback操作就会放到事件队列中去。
◆单线程体现在事件环机制(单线程的执行同步代码,异步代码放到队列中,同步代码都执行完毕后再从队列中取),多线程式体现在非阻塞式IO(有一个线程池专门用来处理IO问题)。
◆linux操作系统下的nodejs的线程池是自己写的,而windows操作系统下的nodejs的线程池是windows操作系统提供的,所以linux操作系统下的nodejs的线程池要好用些,因为毕竟是自己写,自己写的就知道自己要什么。


8.nodejs的优势与劣势
◆node的异步是帮助我们去做了多线程的操作,简化了代码。
◆多线程的好处是可以进行cpu密集型(大量的运算)的操作,但是nodejs不适合开发这种cpu密集型(大量的运算)的应用,因为nodejs是单线程的,它的多线程只针对IO操作。


9.nodejs的核心机制:异步流程控制,也就是同步代码去写异步,大多数情况下,return用于同步,callback用于异步。


10.agularjs的脏检查,之所以脏,是因为机制如此,每一次脏检查都至少会循环两次,但是最多只给你循环十次,脏检查十次就会跳出,然后就over+error了。
◆数据监听:$scope.$watch()
◆循环方法:$scope.$digest()
◆触发脏检查:$scope.$apply()
◆带$的方法修改$scope,都会触发脏检查,如果不带$就需要使用$apply()来触发触发。
◆检查数据是否发生变化,如果发生变化就同步到页面。


11.require引入其它文件或者模块儿时,并不是直接将那些文件的代码或者模块儿直接引入到当前文件中的,而是通过接收文件或者模块儿返回的数据的。


12.文件操作
◆__dirname:当前文件所在的目录,也就是你在哪个文件写了__dirname,那么他就获取该文件所在的目录名(绝对路径)
◆fs模块儿->操作文件->io->nodejs的特长
◆fs模块儿是node非常重要的模块儿,能体现出node的优势
◆fs.readFile()读文件
◆fs.writeFile()写文件:多次写入一个文件就会覆盖,文件不存在就会创建新文件,但是不会创建新文件夹【
//异步写文件 路径 内容 编码 回调
fs.writeFile('./1.js','hillo hillo','utf8',(err)=>{
console.log('err');
});
fs.writeFileSync('./1.js','hillo hillo','utf8')这是同步写文件。
//异步IO由线程池进行操作,所以最好不要同时操作同一个文件,如果异步IO和同步IO同时进行,那么就会有争夺文件使用权的问题,会error的。

◆fs.appendFile()在文件的内部去追加一些内容
◆fs.mkdir()创建文件夹,使用的是linux下的命令,mkdir创建文件夹,一般nodejs官网的文档中如果没有详细的写说明,那么就是直接调用的linux下的命令,那么可以直接搜索 linux 方法名就能够搜索出来,一般在linux下操作文件,这个方法都会有一个mode的可有可无的参数,表示权限【
fs.mkdir('./a',function(err){
})
】。
◆fs.readdir()读文件夹【
fs.readdir('./a',(err,files)=>{
console.log(files);
})

◆fs.access()判断路径
◆fs.stat()更加详细的判断文件或者文件夹【
fs.stat('./a',(err,stats)=>{
//通过stats的众多方法可以更加详细的进行判断,如是不是文件、是不是文件夹、
if(stats.isFile());//文件
if(stats.isDirectory);//文件夹
  if(isSymbolicLink);//快捷方式
})

◆path:是对路径进行操作的模块儿
◆path.join(__dirname,'./f.text');:表示拼接两个路径,返回一个正确的路径,这个方法很常用。
◆path.basename('./ss/xx/sss/f.txt');:会输出f.txt,可以用来获取文件名加后缀名,你也可以指定去掉后缀名,如path.basename('./ss/xx/sss/f.txt','.txt');,会输出f。
◆path.dirname('./ss/xx/sss/f.text');:会输出./ss/xx/sss/,可以用来获取路径,但是不带文件名加后缀名。
◆path.extname('./ss/xx/sss/f.txt');,会输出.txt,会输出文件的后缀名。



13.异常处理
◆计算机不能处理的状况称之为异常
◆nodejs中的同步代码如果出错了,那么会直接报错,进程崩溃。
◆nodejs中的异步IO代码如果出错了,那么会返回一个错误对象,进程不会崩溃。
◆nodejs中的异步IO代码出错返回的错误对象和try-catch返回的错误对象是一样的。
◆try{}catch{}finally{},异步IO代码中使用了异常处理,所以同步代码需要大量的try-catch。
◆你自己不要给异步代码进行try-catch的包裹,因为异步代码里面已经有了异常处理了,try-catch本身就是同步代码,同步代码比异步代码先执行,所以无效,try--catch放在callback中还是有效的。
◆自定义异常: var err=new Error('this is error');
◆使用自定义异常:throw err;,这时候错误信息就会显示到堆栈信息中。
◆自定义异常时,可以通过设置err.code来进行判断是什么样的错误,就相当于自定义枚举一样。
◆异常的处理尤为重要,如果处理的好,程序可以自己对自己进行错误修复。


14.高级的公司,会直接给你配mac、类linux操作系统的,再不然就是让你删掉windows操作系统让你安装一个ubuntu。


15.双向数据绑定的应用场景
◆用在单页面上进行实时更新的一些数据
◆股票的走势、贵金属交易笔数、购物车里的实时计算


16.做一个项目WM(WordMarkup),写一个框架,写几个UI,就能够用了,可能要几年也可能做不成,但是没有关系。


17.angularjs中的控制器,父级的$scope里的属性或者方法会被子级继承,子级如果有就不会再继承了,应用程序的model叫做$rootscope,也就是最根部的$scope了。


18.树形结构遍历
◆深度优先遍历:一直往下,直到没有了,那么再往上一层,再往下,没有了,那么再往上,一层一层往下,下没有了就往上。
◆广度优先遍历:分层来就是广度,就像剥洋葱一样。
◆angularjs遍历$scope是以深度优先遍历为准

猜你喜欢

转载自blog.csdn.net/jwllwj_2018/article/details/80748255