Vue 学习

关于vue的学习总结

第一天学习总结

一、ES6模块化

1、回顾:node.js 中如何实现模块化?

node.js 遵循了 CommonJS 的模块化规范;其中
导入其他模块使用 require() 方法
模块对外共享成员使用 module.exports 对象

2、模块化的好处:

大家都准守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己;

3、前端模块化规范的分类:

AMD 和CMD使用与李玉兰器端的JavaScript 模块化
CommonJS适用于服务器端的JavaScript 模块化

大一统的ES6模块化规范;

4、什么是ES6模块化规范?

ES6模块化规范是浏览器和服务器端通用的模块化开发规范;
ES6 模块化规范中定义:
每个JS文件都是一个独立的模块
导入其他模块成员使用 import 关键字
向外共享模块成员使用 export 关键字

5、在 node.js 中体验 ES6 模块化;

node.js 中默认支持 CommonJS模块化规范,
若想在 node.js 中体验 ES6 模块化,可以按照如下两个步骤进行配置:
1、确保 node.js 的版本号是v14.15.1 或者是更高版本的
2、在package.json 的根节点中添加 “type”:"module"节点;

6、ES6 模块化的基本语法:

(1)默认导出和默认导入

默认导出的语法: export default {默认导出的成员}
默认导入的语法: import 文件名称 from ‘模块标识符’
【注意事项】
模块标识符,文件的路径
先导出,才能导入;
每个模块中,只允许使用唯一的一次 export default { }
接收的文件名称,可以任意名称,只要是合法的名称就可以;

(2)按需导出和按需导入

按需导出的语法: export 按需导出的成员
按需导入的语法: import {s1,s2,say} from ‘模块标识符’
需要什么成员,就导入什么成员;
【注意事项】

  • 每个模块中可以多次按需导出 按需导入的成员名称,必须和按需导出的名称保持一致;先导出,再导入; 按需导入时,可以使用 AS
    关键字进行重命名; import {s1 as str,s2,say} from ‘模块标识符’ ;s1
    就不存在了,如果需要使用,就是str了; 按需导入可以和默认导入一起使用;

(3)直接导入执行某个模块中的代码

直接导入执行某个模块中的代码;
只要单纯的执行某个模块中的代码,并不需要得到模块中向外共享的成员;此时,可以直接导入并执行模块代码,示例代码如下:

01.js
//在当前模块中执行一个for 循环操作
for (let i=0;i<3;i++){
console.log(i)
}

02.js 想要执行01模块代码的文件
//直接导入并执行模块代码,不需要得到向外共享的成员
import './01.js'

二、Promise

1、回调地狱

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

setTimeout(()=>{
//第1层回调函数
consolo.log('延时 1 秒后输出')

setTimeout(()=>{
//第2层回调函数
consolo.log('延时 2秒后输出')

setTImeout(()=>{
//第3层回调函数
consolo.log('延时 3 秒后输出')
},3000)
},2000)
},1000)

回调地狱的缺点

  • 代码耦合性太强,牵一发而动全身,难以维护
  • 大量冗余的代码相互嵌套,代码的可读性变差;

为了解决回调地狱的问题, ES6 中新增了 Promise 的概念;

2、Promise 的基本概念

(1) Promise是一个构造函数;说明可以 new 一个实例对象;

可以创建Promise的实例 const p = new Promise()
new 出来的 Promise实例对象,代表一个异步操作

(2) Promise.prototype 上包含一个 .then()方法

每一次 new Promise() 构造函数得到的实例对象,
都可以通过原型链的方式访问到 .then() 方法,例如:p.then();

(3) .then() 方法用来预先指定成功和失败的回调函数

p.then(成功的回调函数,失败的回调函数)
p.then(result =>{},reeor => {} )
调用 .then() 方法时,成功的回调函数是必选的,失败的回调函数是必选的

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

fs.readFile('要读取的文件路径','utf8',(err1,r1) =>{
if(err1) return console.log(err1.message)
console.log(r1)
})
(1)如何解决回调地狱的问题?

由于 node.js 官方提供的fs模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式;

因此需要 安装 then-fs 第三方包,从而支持 Promise 的方式读取文件的内容;

npm install then-fs

安装成功之后;就可以使用啦!

(2)通过Promise的 .then()方法解决回调地狱的问题

调用 then-fs 提供的readFile()方法,可以异步读取文件内容,它的返回值是 Promise 的实例对象
所以可以调用 .then() 方法为每个 Promise 异步操作指定成功和失败之后的回调函数

thenFs.readFile('要读取的文件路径','utf8').then(
r1 => {console.log(r1)},error =>{console.log(error.message)})

但是上面的代码不能指定文件的读取顺序;

Promise 支持链式调用,从而来解决回调地狱的问题;以及顺序的问题;

thenFs.readFile('第一个要读取的文件路径','utf8')
.then((r1) => {console.log(r1)}
return thenFs.readFile('第二个要读取的文件路径','utf8')
)
.then((r2)=>{console.log(r2)}
return thenFs.readFile('第三个要读取的文件路径','utf8')
)
.then((r3)=>{console.log(r3)})

执行顺序是:r1,r2,r3

4、通过 .catch 捕获错误

在Promise的链式操作中如果出现了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理;

如果不希望前面的错误导致后面 .then() 无法正常执行,则可以将 .catch 的调用提前;

5、promise .all() 方法

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

6、promise .race() 方法

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

7、基于Promise 封装读文件的方法

  • 方法的封装要求 方法的名称要定义为 getFile
  • 方法接收一个形参 fpath,表示要读取的文件的路径
  • 方法的返回值 为 Promise实例对象

getFile 方法的基本定义

注意:代码中的 new Promise() 只是创建了一个形式上的异步操作;

创建getFile 方法具体的异步操作
需要在 new Promise() 构造函数期间,传递一个 function函数,将具体的异步操作定义到 function函数内部;

function getFile(fpath){
return new Promise(function(resolve,reject){
fs.readFile(fpath,'utf8',(err,dataStr)=>{})
})
getFile('要读取的文件路径')
.then((r1) =>{console.log(r1)
})
.catch((err)=>{console.log(err.message)})
}

三、async/await

1、什么是 async/await?

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

  • .then链式调用的优点:解决了回调地狱的问题;
  • .then 链式调用的缺点:代码冗余。阅读性差,不易理解

2、asynv/await的基本使用

import thenFs from 'then-fs'

async function getAllFile(){
const r1 = await thenFs.readFile('./files/1.txt','utf8)
console.log(r1)

const r2 = await thenFs.readFile('./files/2.txt','utf8)
console.log(r2)

const r3 = await thenFs.readFile('./files/3.txt','utf8)
console.log(r3)
}
getAllFile()

【功能】:读取文件1,文件2,文件3

3、async/await的 使用注意事项

  • 如果在 function中使用了 await,则function必须被async修饰;
  • 在async 方法中,第一个 await 之前的代码会同步执行,await之后的代码会异步执行;

四、EventLoop ——同步任务和异步任务

1、JavaScript 是单线程语言

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

单线程执行任务队列的问题
如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题;

2、同步任务和异步任务

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

  • 同步任务

又叫非耗时任务,指的是在主线程上排队执行的那些任务
只有前一个任务执行完毕,才能执行后一个任务

  • 异步任务

又叫耗时任务,异步任务有JavaScript委托给宿主环境进行执行
当异步任务执行完成后,会通知JavaScript主线程执行异步任务的回调函数

3、同步任务和异步任务的执行过程

同步任务有JavaScript主线程次序执行
异步任务委托宿主环境执行
已完成的异步任务对应的回调函数,会被加入到任务队列中等待执行
JavaScript主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行
JavaScript主线程不断重复上面的四个步骤;

4、Eventloop 的基本概念

JavaScript主线程从 ‘“任务队列” 中读取异步任务的回调函数,放到执行栈中依次执行;
这个过程是循环不断的,所以整个的这种运行机制又被称为EventLoop(事件循环);

5、宏任务和微任务

(1)什么是宏任务和微任务?

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

(1)宏任务(macrotask)

  • 异步 AJAX 请求
  • setTimeout,setInterval
  • 文件操作
  • 其他宏任务

(2)微任务

  • Promise.then、.catch 和 .finally
  • Process.nextTick
  • 其他微任务
2、宏任务和微任务的执行顺序?

JavaScript中任务执行顺序
先执行所有的同步任务;
再执行异步任务,异步任务中每一个宏任务执行完之后,都会检查是否存在待执行的微任务;
如果有,则执行完所有微任务之后,再继续执行下一个宏任务;;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值