ES6模块化与异步编程高级用法

一、ES6模块化

1.1 回顾:node.js中如何实现模块化

node.js遵循了CommonJS的模块化规范

  • 导入其他模块使用require()方法
  • 模块对外共享成员使用module.exports对象

模块化的好处:降低沟通成本,极大方便了各个模块之间的相互调用

1.2 前端模块化规范的分类

在这里插入图片描述

1.3 什么是ES6模块化规范

ES6模块化规范是浏览器端与服务器端通用的模块化开发规范

  • 每个js文件都是一个独立的模块
  • 导入其他模块成员使用import关键字
  • 向外共享模块成员使用export关键字

1.4 在node.js中体验ES6模块化

node.js默认仅支持CommonJS模块化规范

  • 步骤一 安装v14.15.1或更高版本的node.js
  • 步骤二 在package.json的根节点添加"type":"module"节点

1.5 ES6模块化的基本语法

1.5.1 默认导出与导入

export defult默认导出的成员

let n1 = 10
let n2 = 20
function show() {

}
//挂载要共享的成员
export default {
    n1,
    show
}

import 接受名称 from ‘模块标识符’

import m1 from './01-默认导出.js'
console.log('m1', m1);

注意事项: 每个模块中,只允许使用唯一的一次 export default,默认导入的时的接收名称可以任意名称.只要是合法的成员名称

1.5.2 按需导出与导入

export 按需导出的成员

export let s1 = 'aaa'
export let s2 = 'bbb'
export function see() {
    console.log('see');
}
export default {
    a: 20
}

按需导入 import {s1} from ‘模块标识符’

//as关键字进行重命名 info为默认导出
import info, { s1, s2 as str2, see } from './03-按需导出.js'
console.log(s1, str2, see);
see()
console.log('info', info);

按需导出与按需导入的注意事项

  • 1.每个模块中可以使用多次按需导出
  • 2.按需导入的成员名称必须和按需导出的名称保持一致
  • 3.按需导入时 可以使用as关键字进行重命名
  • 4.按需导入可以和默认导入一起使用

1.5.3 直接导入并执行模块中的代码

单纯执行某个模块化中的代码

for (let i = 0; i < 3; i++) {
    console.log('i', i);
}
import './05-直接运行模块中的代码.js'

二、Promise

2.1 回调地狱

多层回调函数的相互嵌套,就形成了回调地狱

在这里插入图片描述

2.1.1 如何解决回调地狱的问题

ES6新增了Promise的概念

2.1.2 Promise的基本概念

  • 1.Promise是一个构造函数
    • 创建Promise的实例const p=new Promise()
    • new出来的Promise实例对象,代表一个异步操作
  • 2.Promise.prototype上包含一个.then方法
    • 每一次new Promise()构造函数得到的实例对象
    • 都可以通过原型链的方式访问到.then()方法,例如p.then()
  • 3.then()方法用来预先指定成功和失败的回调函数
    • p.then(成功的回调函数,失败的回调函数)
    • p.then(result=>{},error=>{})
    • 调用.then()方法时,成功的回调函数是必选的,失败的回调函数是可选的

2.2 基于回调函数按顺序读取文件内容

在这里插入图片描述

2.3 基于then-fs读取文件内容

由于 node.js 官方提供的 fs 模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式。因此,需要先运行如下的命令,安装 then-fs 这个第三方包,从而支持我们基于 Promise 的方式读取文件的内容

npm install then-fs

2.3.1 then-fs的基本使用

调用then-fs提供的readFile()方法,可以异地读取文件的内容,返回值是Promise的实例对象,可以调用 .then() 方法

//导入
import thenFS from 'then-fs'
//异步读取文件 无法保证文件的读取顺序
thenFS.readFile('./files/1.txt', 'utf8').then(res => { console.log(res); })
thenFS.readFile('./files/2.txt', 'utf8').then(res => { console.log(res); })
thenFS.readFile('./files/3.txt', 'utf8').then(res => { console.log(res); })

2.3.2 then()方法的特性

如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理。通过 .then() 方法的链式调用,就解决了回调地狱的问题。

2.3.3 基于Promise按顺序读取文件的内容

Promise 支持链式调用,从而来解决回调地狱的问题

import thenFs from "then-fs"
thenFs.readFile("./files/11.txt", 'utf8')
    .then((r1) => {
        console.log('r1', r1);
        return thenFs.readFile("./files/2.txt", 'utf8')
    }).then((r2) => {
        console.log('r2', r2);
        return thenFs.readFile("./files/3.txt", 'utf8')
    }).then((r3) => {
        console.log('r3', r3);
    })

2.3.4 通过.catch捕获错误

import thenFs from "then-fs"
thenFs.readFile("./files/11.txt", 'utf8')
    .catch((err) => {
        console.log('err', err.message);
    })
    .then((r1) => {
        console.log('r1', r1);
        return thenFs.readFile("./files/2.txt", 'utf8')
    }).then((r2) => {
        console.log('r2', r2);
        return thenFs.readFile("./files/3.txt", 'utf8')
    }).then((r3) => {
        console.log('r3', r3);
    })

2.3.5 Promise.all()方法

发起并行的 Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的 .then 操作(等待机制)

import thenFs from "then-fs"
const promiseArr = [
    thenFs.readFile("./files/1.txt", 'utf8'),
    thenFs.readFile("./files/2.txt", 'utf8'),
    thenFs.readFile("./files/3.txt", 'utf8')
]
//发起并行的异步操作 等待机制
Promise.all(promiseArr).then(result => {
   console.log(result); //指向一个 数组[ '111', '222', '333' ]
 })

2.3.6 Promise.race()方法

Promise.race() 方法会发起并行的 Promise 异步操作,只要任何一个异步操作完成,就立即执行下一步的 .then 操作(赛跑机制)

import thenFs from "then-fs"
const promiseArr = [
    thenFs.readFile("./files/1.txt", 'utf8'),
    thenFs.readFile("./files/2.txt", 'utf8'),
    thenFs.readFile("./files/3.txt", 'utf8')
]
//赛跑机制
Promise.race(promiseArr).then(result => {
    console.log(result); //指向单独一个(执行最块的哪一个) 
})

2.4 基于Promise封装文件的方法

2.4.1 getFile方法的基本定义

在这里插入图片描述

2.4.2 创建具体的异步操作

在这里插入图片描述

2.4.3 获取.then的两个实参

在这里插入图片描述

2.4.4 调用resolve和reject回调函数

在这里插入图片描述


import thenFs from 'then-fs'
function getFile(fpath) {
    //创建实例对象
    return new Promise(function (resolve, reject) {
        //创建读文件的异步操作
        thenFs.readFile(fpath, 'utf8', (err, dataStr) => {
            if (err) return reject(err);
            resolve(dataStr)
        })
    })
}
getFile('./files/11.txt').then((res) => {
    console.log('成功回调', res);
},
    //失败的回调可以不写 用catch捕获
    // (err) => {
    //     console.log('失败回调', err.message);
    // }
).catch((err) => {
    console.log('失败回调', err.message);

})

三、async/await

3.1 什么是async/await

async/await 是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在 async/await 出现之前,开发者只能通过链式 .then() 的方式处理 Promise 异步操作。

在这里插入图片描述

3.2 async/await的基本使用

import thenFs from "then-fs"

console.log('A');
async function getAllFile() {
    console.log('B');

    const r1 = await thenFs.readFile("./files/1.txt", 'utf8')
    console.log('r1', r1);
    const r2 = await thenFs.readFile("./files/2.txt", 'utf8')
    console.log('r2', r2);
    const r3 = await thenFs.readFile("./files/3.txt", 'utf8')
    console.log('r3', r3);
    console.log('D');

}

getAllFile()
console.log('C');  //最后输出结果A B C D

3.3 async/await的使用注意事项

  • 如果在 function 中使用了 await,则 function 必须被 async 修饰
  • 在 async 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行
    在这里插入图片描述

四、EventLoop

4.1 JS是单线程的语言

JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。

在这里插入图片描述

4.2 同步任务与异步任务

为了防止某个耗时任务导致程序假死的问题,JavaScript 把待执行的任务分为了两类:

  • 1.同步任务((synchronous)
    • 又叫做非耗时任务,指的是在主线程上排队执行的那些任务
    • 只有前一个任务执行完毕,才能执行后一个任务
  • 2.异步任务(asynchronous)
    • 又叫做耗时任务,异步任务由 JavaScript 委托给宿主环境进行执行
    • 当异步任务执行完成后,会通知 JavaScript 主线程执行异步任务的回调函数

4.3 同步任务与异步任务的执行过程

在这里插入图片描述

4.4 EventLoop的基本概念

在这里插入图片描述
在这里插入图片描述

五、宏任务与微任务

5.1 什么是宏任务和微任务

JavaScript 把异步任务又做了进一步的划分,异步任务又分为两类,分别是

  • 1.宏任务(macrotask)
    • 异步Ajax请求
    • setTimeout、setInterval、
    • 文件操作
    • 其他宏任务
  • 2.微任务(microtask)
    • Promise.then、.catch 和 .finall
    • process.nextTick
    • 其它微任务
      在这里插入图片描述

5.2 宏任务和微任务的执行顺序

在这里插入图片描述

5.3 实例场景

在这里插入图片描述

5.4 分析输出顺序

在这里插入图片描述

5.5 经典面试题

在这里插入图片描述

六、API接口实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gik99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值