ES6模块化

1、模块化规范

1.1、ES6 模块化

  • 属于ECMAscript规范

  • 每个 js 文件都是一个独立的模块

  • 导入其它模块成员使用 import 关键字

  • 向外共享模块成员使用 export 关键字

1.2、node模块化

  • 支持commonJs模块化规范

  • 导入其它模块成员使用 require

  • 向外共享模块成员使用 exports或者module.exports

2、在node.js中使用es6模块化规范

  • 确保安装了 v14.15.1 或更高版本的 node.js

  • 在 package.json 的根节点中添加 "type": "module" 节点

3、ES6 模块化的基本语法

默认导出与默认导入
exportdefault { }  //导出
importm1from'./01.默认导出.js'   //导入
按需导出与按需导入
exportlets1='aaa'
exportlets2='ccc'
exportfunctionsay() {}
exportdefault { a:10 }
importinfo, { s1, s2asstr2, say } from'./03.按需导出.js'

export和export default的区别

  • export后面跟的是一个声明的表达式或者函数,可以使用多次

  • export default后面跟的是一个值(对象或者数组),只能使用一次

  • 两者指向不一样

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

for (leti=0; i<3; i++) {
  console.log(i)
}
import'./05.直接运行模块中的代码.js'
  • 每个模块中可以使用多次按需导出,只能使用一次默认导出

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

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

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

二、Promise

1、回调地狱

  • 想让异步按顺序执行,所以进行嵌套,从而造成了回调地狱

  • 回调地狱耦合性强,不利于维护

  • 多层回调函数相互嵌套会造成回调地狱,promise用来解决回调地狱

2、Promise概述

  • Promise 是一个构造函数

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

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

3、在node.js中想要基于 Promise 的方式读取文件需要导入then-fs包

4、.then()

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

5、.catch()

使用 Promise.prototype.catch 方法进行捕获和处理错误

6、Promise.all()方法

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

importthenFsfrom'then-fs'
​
constpromiseArr= [
  thenFs.readFile('./files/3.txt', 'utf8'),
  thenFs.readFile('./files/2.txt', 'utf8'),
  thenFs.readFile('./files/1.txt', 'utf8'),
]
Promise.all(promiseArr).then(result=> {
  console.log(result)
})

7、Promise.race()

  • 只要任何一个异步操作完成,就立即执行下一步的.then 操作(赛跑机制)

Promise.race(promiseArr).then(result=> {
  console.log(result)
})

8、promise原理

import fs from 'fs'
function resolveFile(path) {
  const p = new Promise(function (resolve, reject) {
    fs.readFile(path, 'utf8', function (err, dataStr) {
      if (err) return reject(err.message);
      resolve(dataStr);
    })   
  })
   return p;
}
​
// 调用
resolveFile('./files/1.txt').then(res=> {
  console.log(res);
  return resolveFile('./files/2.txt')
}).then(res=> {
  console.log(res);
}).catch(err=> {
  console.log(err);
})

三、async / await

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

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

importthenFsfrom'then-fs'
​
console.log('A')
asyncfunctiongetAllFile() {
  console.log('B')
  constr1=awaitthenFs.readFile('./files/1.txt', 'utf8')
  console.log(r1)
  constr2=awaitthenFs.readFile('./files/2.txt', 'utf8')
  console.log(r2)
  constr3=awaitthenFs.readFile('./files/3.txt', 'utf8')
  console.log(r3)
  console.log('D')
}
​
getAllFile()
console.log('C')

四、EventLoop

1、同步任务

  • 非耗时任务,前一个任务执行完毕才执行下一个任务

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

2、异步任务

  • 耗时任务,委托给宿主环境执行

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

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

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

  • 在JavaScript的主线程中,依次执行,看到同步任务直接执行,如果遇到异步任务,就委托给宿主环境去执行,主线程接着执行下面的同步任务,宿主环境将异步任务执行完毕之后,将异步任务的回调函数放到任务队列中等待主线程读取执行,在宿主环境中的异步任务是同时执行的,谁执行的快就将它的回调函数放到任务队列等待主线程读取执行。

4、回调函数

  • node中的方法,定时器,事件处理函数

5、异步任务又分为两类

5.1、宏任务(macrotask)

  • 异步 Ajax 请求、

  • setTimeout、setInterval、

  • 文件操作

  • 其它宏任务

5.2、微任务(microtask)

  • Promise.then、.catch 和 .finally

  • process.nextTick

  • 其它微任务

5.3、执行顺序

  • 每一个宏任务执行完之后,都会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再继续执行下一个宏任务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值