目录
1. ES6模块化
模块化的优点:大家都遵循同样的模块化规范写代码,降低沟通成本,极大方便了各个模块之间的相互调用。
回顾:Node.js中如何实现模块化(Node.js遵循了CommonJS的模块化规范)
- 导入其他模块使用 require() 方法
- 模块对外共享成员使用module.exports对象
1.1 什么是ES6模块化规范
在node.js中实现ES6模块化:
1.2 ES6模块化的基本语法
1.2.1 默认导出和默认导入
- 默认导出:
export default 默认导出的成员
注意:每个模块中,只允许使用唯一的一次export default,否则会报错! - 默认导入:
import 接收名称 from '模块标识符'
默认导入时的接收名称可以是任意名称,只要是合法的成员名称即可
1.2.2 按需导出和按需导入
- 按需导出语法:
export 按需导出的成员
- 按需导入语法:
import {s1} from '模块标识符'
注意事项:
- 每个模块中可以使用
多次
按需导出 - 按需导入的成员名称必须和按需导出的名称
保持一致
- 按需导入时,可以使用
as关键字
进行重命名 - 按需导入可以和默认导入一起使用
1.2.3 直接导入并执行模块中代码
直接 import 路径
即可,不需要用from接收
2. Promise
2.1 回调地狱
多层回调函数的相互嵌套,就形成了回调地狱。
缺点:
- 代码耦合性太强,牵一发而动全身,难以维护
- 大量冗余的代码相互嵌套,代码的可读性变差
2.2 Promise的基本概念
ES6新增了Promise
(支持链式调用)来解决回调地狱问题
- Promise是一个构造函数
可以创建 Promise 实例const p = new Promise()
new出来的 Promise实例对象,代表一个异步操作
- Promise. prototype 上包含一个
.then()
方法
每次new Promise()构造函数得到的实例对象,都可以通过原型链的方式
访问到 .then() 方法,例如 p.then() - .then() 方法用来预先指定成功和失败的回调函数
p.then(成功的回调函数—必选,失败的回调函数—可选)
p.then(result => { }, error => { }) - .then() 方法的特性
如果上一个.then() 方法return 返回了一个新的Promise实例对象
,则可以通过下一个.then() 继续处理。 通过.then() 方法的链式调用
,就解决了回调地狱问题
2.2 Promise方法
.catch捕获错误
在Promise的链式操作中如果发生了错误,可以使用 Promise.prototype.catch
方法进行捕获和处理
Promise.all()方法
会发起并行的Promise异步操作,等所有的异步操作全部结束后
才会执行下一步的 .then 操作(等待机制)。
Promise.race()方法
会发起并行的Promise异步操作,只要任何一个异步操作完成,就立即执行下一步的.then 操作
(赛跑机制)
2.3 基于Promise封装读文件方法
方法封装要求
- 方法的名称要定义为
getFile
- 方法接受一个
形参 fpath
,表示要读取的文件路径 - 方法的
返回值
为Promise实例对象
getFile方法的基本定义:
创建具体的异步操作:
2.4 获取 .then 的两个实参
调用 resolve 和 reject 回调函数
3. async / await
在 async / await 出现之前,开发者只能通过 链式. then() 的方式处理Promise异步操作。. then() 链式调用可以解决回调地狱问题,但是代码冗余、阅读性差,不易理解。
async / await 是 ES8 引入的新语法,用来简化 Promise 异步操作
使用注意事项:
4. EventLoop
EventLoop 事件循环,是一个不断进行循环的机制,会不断去寻找可以执行的任务来执行。
在执行完同步任务之后(清空了调用栈后),首先会优先执行微任务队列的任务(先入先出规则),把微任务队列的任务清空以后才会去执行下一轮宏任务,并不是把宏任务全部执行了再执行微任务,这样就可以避免因为宏任务繁重导致任务的阻塞,所以下面黑马的PPT讲解私以为不太妥当,应该加前提。
同步任务和异步任务:
5. 宏任务和微任务
异步任务分为:宏任务 + 微任务(队列按照先入先出规则)
宏任务执行之前,先检查是否有待执行的微任务;
只要new Promise就会立即执行里面的函数,所以56行是同步任务;