1:NodeJS 是什么
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
NodeJS 的特点
其特点为:
-
它是一个 Javascript 运行环境
-
依赖于 Chrome V8 引擎进行代码解释
-
事件驱动
-
非阻塞 I/O
-
轻量、可伸缩,适于实时数据交互应用
-
单进程,单线程
NodeJS 的优缺点:
-
优点:1. 高并发(最重要的优点)2. 适合 I/O 密集型应用
-
缺点:
-
不适合 CPU 密集型应用;CPU 密集型应用给 Node 带来的挑战主要是:由于JavaScript 单线程的原因,如果有长时间运行的计算(比如大循环),将会导致 CPU 时间片不能释放,使得后续 I/O 无法发起;
-
只支持单核 CPU,不能充分利用 CPU
-
可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
-
开源组件库质量参差不齐,更新快,向下不兼容
-
Debug 不方便,错误没有 stack trace
-
-
原因:单进程,单线程
-
解决方案:
1.分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞 I/O调用的发起;
2.Nnigx 反向代理,负载均衡,开多个进程,绑定多个端口;
3.开多个进程监听同一个端口,使用 cluster 模块;
async、await
async/await是什么?
简而言之, async用于申明一个function是异步的;而await则可以认为是 async await的简写形式,是等待一个异步方法执行完成的。
async和await的基础使用
-
async 表示这是一个async函数, await只能用在async函数里面,不能单独使用
-
async 返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行
-
await 等待的是一个Promise对象,后面必须跟一个Promise对象,但是不必写then(),直接就可以得到返回值
async/await的特点
1、Async作为关键字放在函数前面,普通函数变成了异步函数
2、异步函数async函数调用,跟普通函数调用方式一样。在一个函数前面加上async,变成async函数,异步函数,return:1,打印返回值,
3、返回的是promise成功的对象,
4、Async函数配合await关键字使用
async/await的优点
1.方便级联调用:即调用依次发生的场景;
2.同步代码编写方式:Promise使用then函数进行链式调用,一直点点点,是一种从左向右的横向写法;async/await从上到下,顺序执行,就像写同步代码一样,更符合代码编写习惯;
3.多个参数传递:Promise的then函数只能传递一个参数,虽然可以通过包装成对象来传递多个参数,但是会导致传递冗余信息,频繁的解析又重新组合参数,比较麻烦;async/await没有这个限制,可以当做普通的局部变量来处理,用let或者const定义的块级变量想怎么用就怎么用,想定义几个就定义几个,完全没有限制,也没有冗余工作;
4.同步代码和异步代码可以一起编写:使用Promise的时候最好将同步代码和异步代码放在不同的then节点中,这样结构更加清晰;async/await整个书写习惯都是同步的,不需要纠结同步和异步的区别,当然,异步过程需要包装成一个Promise对象放在await关键字后面;
5.基于协程:Promise是根据函数式编程的范式,对异步过程进行了一层封装,async/await基于协程的机制,是真正的“保存上下文,控制权切换……控制权恢复,取回上下文”这种机制,是对异步过程更精确的一种描述;
6.async/await是对Promise的优化:async/await是基于Promise的,是进一步的一种优化,不过在写代码时,Promise本身的API出现得很少,很接近同步代码的写法