在上面的步骤中扫通了http请求到结束的一个闭环包括请求时的头信息、响应时候服务器返回的头信息,状态码等等
这些在Node http模块中都能获取到并且有相应的接口去组装这些信息和返回它们,同时呢这些http接口在设计的时候就考虑了可以支持许多可以支持http协议的特性
而这些特性在传统的开发中却很难使用,比如大字节的块编码消息
为了让用户在请求和响应的时候使用流的形式操作数据接口缓存整个请求或者响应,整套http api都很底层,它只处理流之间的操作以及信息解析
可以把信息解析为请求头和请求体,但不去解析实际的请求头和请求正文里面的具体内容
这个就是关于NodeJs中http模块的介绍
什么是回调?
回调是异步编程最基本的方法,对于NodeJs来说,需要按顺序执行异步逻辑的时候,一般采取后续传递的方式,也就是将后续逻辑封装在回调函数中作为起始函数的参数,逐层去嵌套 通过这种方式来让程序按照我们所期望的方式走完流程
案例如下:
声明一个learn函数
function learn(something){ console.log(something) }
然后再声明个we函数,两个参数
第一个是回调callback,便于理解
function we(callback,something){ something += ‘ is cool‘ callback(something) }
最后来调用
we(learn,‘Nodejs‘)
执行结果如下:
这种是叫做具名函数(具体有名字的函数)
还有一种是匿名函数,直接调用如下:
we(function(something){ console.log(something) },‘Jade‘)
执行结果如下:
什么是同步/异步?
对于异步对立就是同步,同步就是执行一个任务,后一个任务等待前一个任务结束,然后再执行。
程序的执行顺序与任务的排列顺序是一致的,浏览器端的js是单线程的,因此js代码只能按顺序执行,即便是js可以并行的去下载但也只能按顺序执行,
如果某个js内有比较耗时的操作,那么页面就会被阻塞,后面的js代码就不会被执行到
比如说一个页面里面有3个js引入
// <script src=‘a.js‘></script> // <script src=‘b.js‘></script> // <script src=‘c.js‘></script> b.js代码如下 var i = 0 while(true){ i++ }
此js就会被一直阻塞在这里。
异步的模式则完全不同
每个任务都有一个或多个回调函数,前一个任务结束之后不是执行后一个任务,而是执行回调函数,后一个任务也不是等待前一个任务结束就执行任务的执行顺序与排列顺序是不一致的,是异步 的
在JavaScript中最基础的异步函数则是setTimeout和setinterval
setTimeout会在给定的时间结束后执行给定的函数,接受一个回调函数作为第一个参数
代码如下——顺序执行(第一版):
var c = 0 function printIt(){ console.log(c) } function plus(){ c +=1 } plus() printIt()
结果毋庸置疑是:1
结果如下:
如果在plus中有些异步的操作或者比较耗时的操作,那这个时候就不一定
能拿到我们所期望的结果,加个setTimeout,然后再执行,那么能拿到什么样的结果呢?
代码如下——阻塞执行(第二版):
var c = 0 function printIt(){ console.log(c) } function plus(){ setTimeout(function(){ c +=1 },1000) } plus() printIt()
执行结果如下:
这就不是我们所期望的那个1
那这个时候怎么办呢?
可以把plus方法改造一下,传递一个回调函数,然后再setTimeout里面调用回调函数,
然后把结果传递下去,最后把printIt作为参数传递给plus
代码如下——顺序执行(第一版):
var c = 0 function printIt(){ console.log(c) } function plus(callback){ setTimeout(function(){ c +=1 callback(c) },1000) } plus(printIt)
执行结果如下:
最后打印出了我们所期望的结果:就是1
什么是I/O?
磁盘的写入和读取在NodeJs里,本身呢就是为文件系统、数据库之类的资源提供接口,
向文件系统发送一个请求的时候,不用等待硬盘,等硬盘准备好了之后,非阻塞接口会通知到NodeJs
什么是单线程/多线程?
单线程对应的就是多线程
单线程:程序的功能按照顺序来执行,只有前面的流程都执行成功以后,
后面的流程才能被执行到
单线程特点:安全
各有优缺点,多线程就是要把握好资源调配
什么是阻塞/非阻塞?
什么是事件?
什么是事件驱动?
什么是基于事件驱动的回调?
什么是事件循环?