前端学习--ES6模块化与异步编程高级用法

news2024/11/16 0:35:40

一、ES6模块化

1.1 概念与规则

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

ES6 模块化规范中定义:

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

1.2 在node.js体验es6模块化 

配置如下:

  1. 确保安装v14.15.1或更高版本的node(node -v查看版本)
  2. npm init -y初始化包管理配置文件
  3. 在package.json添加"type":"module"

 

 1.3 ES6模块化的基本语法

  1. 默认导入与默认导出
  2. 按需导入与按需导出
  3. 直接导入并执行模块中的代码

1.3.1 默认导出与导入

export default 默认导出的成员

import 接收名称 from '模块标识符'

每个模块只能使用一次export default

导入的接收名称任意

1.3.2 按需导入与导出

export 按需导出的成员

import {接收名称} from ‘模块标识符’

每个模块中可以使用多次按需导出

按需导入的成员名称必须和按需导出的名称保持一致

按需导入时,可以使用 as 关键字进行重命名

按需导入可以和默认导入一起使用

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

import '代码文件路径'

二、Promise

回调地狱

多层回调函数的相互嵌套

缺点:耦合性强、可读性差

2.1 基本概念

  • Promise是一个构造函数

const p = new Promise()

  • Promise.prototype上包含.then()方法
  • .then()用来预先指定成功和失败的回调函数

p.then(result=>{}, error=>{})

2.2 then-fs使用

2.2.1 基本使用

先装包 npm i then-fs

import thenFs from 'then-fs'

//无法保证读取文件的顺序
thenFs.readFile('./file/1.txt', 'utf8').then((r1) => {console.log(r1)})
thenFs.readFile('./file/2.txt', 'utf8').then((r2) => {console.log(r2)})
thenFs.readFile('./file/3.txt', 'utf8').then((r3) => {console.log(r3)})

因为上述代码是异步执行,无法保证读取文件的顺序,所以需要优化

下面通过链式调用解决了无法顺序读取文件的问题

import thenFs from 'then-fs'

//.then()的返回值是新的promise对象
thenFs.readFile('./file/1.txt', 'utf8').then((r1) => {
    console.log(r1)
    return thenFs.readFile('./file/2.txt', 'utf8')
})//链式调用
.then((r2) => {
    console.log(r2)
    return thenFs.readFile('./file/3.txt', 'utf8')
})
.then((r3) => {
    console.log(r3)
})

2.2.2 通过catch捕获错误

import thenFs from 'then-fs'

//.then()的返回值是新的promise对象
thenFs.readFile('./file/11.txt', 'utf8').then((r1) => { //如果没有11.txt
    console.log(r1)
    return thenFs.readFile('./file/2.txt', 'utf8')
})//链式调用
.then((r2) => {
    console.log(r2)
    return thenFs.readFile('./file/3.txt', 'utf8')
})
.then((r3) => {
    console.log(r3)
})
.catch(err => {
    console.log(err.message)
})

2.2.3 Promise.all()

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

import thenFs from 'then-fs'

const promiseArr = [
    thenFs.readFile('./file/1.txt', 'utf8'),
    thenFs.readFile('./file/2.txt', 'utf8'),
    thenFs.readFile('./file/3.txt', 'utf8')
]
//数组中promise实例的顺序就是最后结果的顺序
Promise.all(promiseArr).then(result => {
    console.log(result)
})

2.2.4 Promise.race()

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

三、async/await

async/await 是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作

3.1 基本使用

import thenFs from 'then-fs'

async function getAllFiles(){
    const r1 = await thenFs.readFile('./file/1.txt', 'utf8')
    console.log(r1)
    const r2 = await thenFs.readFile('./file/2.txt', 'utf8')
    console.log(r2)
    const r3 = await thenFs.readFile('./file/3.txt', 'utf8')
    console.log(r3)
}

getAllFiles()

① 如果在 function 中使用了 await,则 function 必须被 async 修饰

② 在 async 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行

 

四、EventLoop 

4.1 单线程语言

JS是单线程执行的语言,同一时刻只能做同一件事情

缺点:如果某一个任务非常耗时,则后续任务必须等待,则会导致程序假死

4.2 同步任务和异步任务

4.2.1 同步任务

又叫做非耗时任务,指的是在主线程上排队执行的那些任务

只有前一个任务执行完毕,才能执行后一个任务

4.2.2 异步任务

又叫做耗时任务,异步任务由 JavaScript 委托给宿主环境(浏览器/node)进行执行

当异步任务执行完成后,会通知 JavaScript 主线程执行异步任务的回调函数

4.3 同步任务和异步任务执行过程 

① 同步任务由 JavaScript 主线程次序执行

② 异步任务委托给宿主环境执行

③ 已完成的异步任务对应的回调函数,会被 加入到任务队列中等待执行

④ JavaScript 主线程的执行栈被清空后,会 读取任务队列中的回调函数,次序执行

⑤ JavaScript 主线程不断重复上面的第 4 步

 五、宏任务和微任务

JavaScript 把异步任务又做了进一步的划分为宏任务和微任务

① 宏任务(macrotask)

  • 异步 Ajax 请求、
  • setTimeout、setInterval、
  • 文件操作
  • 其它宏任务

② 微任务(microtask)

  • Promise.then、.catch 和 .finally
  • process.nextTick
  • 其它微任务

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问题】常见问题解决方法

记录在项目运行中遇到的问题,和常用的软件安装包 文章目录 安装包下载第一章:运行C/C小白运行须知1.DevC运行(最简单,推荐)2.Visual Studio 运行3.VC运行 第二章:运行C#项目1.VS环境2.打开C#项目启动失败&a…

LiteDram仿真验证(二):仿真中,DDR3初始化问题

目录 前言一、讨论1、[init_done never goes to 1 in simulation #145](https://github.com/enjoy-digital/litedram/issues/145)2、[Add ECP5 support to standalone core generator #106](https://github.com/enjoy-digital/litedram/issues/106)3、[Help generating DDR3 Ve…

【unity插件】2d切割破坏插件-Smart Slicer 2D

文章目录 效果1.切割2.破坏3.创建源码使用1.导入插件2.摄像机3.新建地面4.新建切割刀5.新建切割食物6. 运行即可不同slicer Type的切割刀类型测试1.线性2.Complex3.点4.多边形5.explode6.创建效果 1.切割

华为OD机试之数列描述(Java源码)

数列描述 题目描述 有一个数列a[N] (N60),从a[0]开始,每一项都是一个数字。数列中a[n1]都是a[n]的描述。其中a[0]1。规则如下: a[0]:1a[1]:11(含义:其前一项a[0]1是1个1,即“11”。表示a[0]从左到右,连续出…

Java简单实现短信验证登录(Session、Redis)

前端设计 <div class"login-form"><div style"display: flex; justify-content: space-between"><el-input style"width: 60%" placeholder"请输入手机号" v-model"form.phone" ></el-input><e…

winform的RichTextBox控件追加文本及图片(实现笔记录入和笔记搜索功能)

在工作中&#xff0c;在工作中&#xff0c;难免有一些笔记要记录下来&#xff0c;方便后续工作中快速找到。之前用的是共享文档来记录的&#xff0c;但有一个缺点就是随着写的内容越来越多&#xff0c;打开变得很慢&#xff0c;搜索更加慢&#xff0c;网络不好的时候&#xff0…

Redis的常用数据结构之有序集合类型

有序集合的特点 集合中的元素有序&#xff0c;不可以重复与列表通过索引实现有序不同&#xff0c;有序集合实现有序的方式是通过给每一个集合元素设置一个分数score字段作为排序依据集合中的元素不能重复&#xff0c;但是score可以重复无法通过某一个下标的方式获取元素单个集…

大数据:spark环境搭建,local模式,standalone模式,zookeeper standby,yarn模式

大数据&#xff1a;spark环境搭建&#xff0c;local模式 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;or…

chatgpt赋能python:Python列表倒序排列

Python列表倒序排列 介绍 Python是一种强大的编程语言&#xff0c;经过多年的发展&#xff0c;它已成为最受欢迎的编程语言之一。Python列表是一个非常有用的数据结构&#xff0c;它允许您将多个项目组合在一起&#xff0c;并可以轻松地对它们进行排序和操作。本篇文章将介绍…

Cubase12没有声音解决办法(Windows 11专用)

本文章由CSDN 不想加班呀 原创&#xff0c;转载请注明出处。 作者首页&#xff1a;不想加班呀的博客_CSDN博客-Python爬虫,电脑小知识,程序员剪视频领域博主 目录 前言 解决办法 第一步&#xff08;进入系统硬件和声音设置界面&#xff09; 第二步&#xff08;在声音设置中…

【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

05.JavaWeb-Servlet

1.Servlet基础 1.1 Servlet概述 用于处理客户端传来的HTTP请求&#xff0c;并返回一个响应&#xff08;特点&#xff1a;方便、跨平台、灵活性和可扩展性&#xff09; 1.2 Servlet开发入门 1.2.1 Servlet接口及实现类 1.最基本的接口是javax.servlet.Servlet&#xff0c;Ser…

高完整性系统工程(十二):Separation Logic for Automated Verification

目录 1. INTRODUCTION TO SEPARATION LOGIC 分离逻辑 1.1 霍尔推理&#xff08;Hoare Reasoning&#xff09; 1.2 堆指针的影响 1.3 全局和局部推理&#xff08;Global and Local Reasoning&#xff09; 1.4 组合推理&#xff08;Compositional Reasoning&#xff09; 1.…

SpringBoot通过加装外部JAR包中的类实现业务插件功能

综合记录一下关于ClassLoader和Spring Bean的动态加载卸载功能 目录 一、需要说明二、总体设计三、具体设计3.1 加载卸载Bean工具类3.2 创建卸载方法3.3 创建加载方法3.4 创建获取具体服务类方法 四、总结 一、需要说明 有一个公共的发送通知的接口&#xff0c;这个接口需要做…

CUDA配置正确,但是torch.cuda.is_available()却是False的解决方案

1.torch.cuda.is_available()返回为False 有时候我们想要使用GPU加速&#xff0c;但是发现CUDA、pytorch都安装好了&#xff0c;且版本也匹配&#xff0c;但是仍然无法使用GPU,显示信息如下&#xff1a; 这时候我们可以看看是不是我们的Pytorch的问题 2.输入下面命令查看pyto…

(学习日记)2023.04.26

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

cesium-native编译

我相信点进这个博客的都是一些cesium专业人才&#xff0c;这文章只起了一个抛砖引玉的作用&#xff0c;希望各位人才不惜赐教。 Github地址&#xff1a;CesiumGS/cesium-native (github.com) 编译需求&#xff1a;升级公司的3dtile的架构&#xff0c;提高性能 博客目的&…

(转载)基于混合粒子群算法的TSP问题求解(matlab实现)

1 理论基础 标准粒子群算法通过追随个体极值和群体极值完成极值寻优&#xff0c;虽然操作简单&#xff0c;且能够快速收敛&#xff0c;但是随着迭代次数的不断增加&#xff0c;在种群收敛集中的同时&#xff0c;各粒子也越来越相似&#xff0c;可能在局部最优解周边无法跳出。…

福利·分析

竞争使得生产者剩余和消费者剩余的和最大化 无谓损失指的是由于过量生产或生产不足造成的消费者剩余和生产者剩余的净损失。 税收与补贴的福利分析 从量税效果&#xff1a; 为简单期间&#xff0c;我们对某种商品征收从量税&#xff1a;对每一销售的单元&#xff0c;征收特定…

汽车电子设计之AUTOSAR中CanNM模块

目录 前言 正文 网络节点类型 仅本地唤醒 仅网络唤醒 本地网络唤醒 KL15电唤醒 NM状态机 Bus Sleep Mode Network Mode Prepare Bus-Sleep Mode Passive Mode 状态机时间参数总结 NM状态机切换 网络管理报文结构 NM报文总体结构解析 CBV详解 常用函数接口 前言…