ES6——知识点记录(下)

简介: ES6——知识点记录(上)

4.async和await

消除回调

有了Promise,异步任务就有了一种统一的处理方式

有了统一的处理方式,ES官方就可以对其进一步优化

ES7推出了两个关键字asyncawait,用于更加优雅的表达Promise

async

async关键字用于修饰函数,被它修饰的函数,一定返回Promise

async function method1(){
  return 1; // 该函数的返回值是Promise完成后的数据
}
method1(); // Promise { 1 }
async function method2(){
  return Promise.resolve(1); // 若返回的是Promise,则method得到的Promise状态和其一致
}
method2(); // Promise { 1 }
async function method3(){
  throw new Error(1); // 若执行过程报错,则任务是rejected
}
method3(); // Promise { <rejected> Error(1) }
await

await关键字表示等待某个Promise完成,它必须用于async函数中

async function method(){
  const n = await Promise.resolve(1);
  console.log(n); // 1
}
// 上面的函数等同于
function method(){
  return new Promise((resolve, reject)=>{
    Promise.resolve(1).then(n=>{
      console.log(n);
      resolve(1)
    })
  })
}

await也可以等待其他数据

async function method(){
  const n = await 1; // 等同于 await Promise.resolve(1)
}

如果需要针对失败的任务进行处理,可以使用try-catch语法

async function method(){
  try{
    const n = await Promise.reject(123); // 这句代码将抛出异常
    console.log('成功', n)
  }
  catch(err){
    console.log('失败', err)
  }
}
method(); // 输出: 失败 123
Promise的基本概念
链式调用规则

then方法必定会返回一个新的Promise

可理解为后续处理也是一个任务

新任务的状态取决于后续处理:

若没有相关的后续处理,新任务的状态和前任务一致,数据为前任务的数据

若有后续处理但还未执行,新任务挂起。

若后续处理执行了,则根据后续处理的情况确定新任务的状态

- 后续处理执行无错,新任务的状态为完成,数据为后续处理的返回值

- 后续处理执行有错,新任务的状态为失败,数据为异常对象

- 后续执行后返回的是一个任务对象,新任务的状态和数据与该任务对象一致

Promise的静态方法
方法名 含义
Promise.resolve(data) 直接返回一个完成状态的任务
Promise.reject(reason) 直接返回一个拒绝状态的任务
Promise.all(任务数组) 返回一个任务
任务数组全部成功则成功
任何一个失败则失败
Promise.any(任务数组) 返回一个任务
任务数组任一成功则成功
任务全部失败则失败
Promise.allSettled(任务数组) 返回一个任务
任务数组全部已决则成功
该任务不会失败
Promise.race(任务数组) 返回一个任务
任务数组任一已决则已决,状态和其一致

5.Fetch Api

Fetch Api 概述

XMLHttpRequest的问题

  1. 所有的功能全部集中在同一个对象上,容易书写出混乱不易维护的代码
  2. 采用传统的事件驱动模式,无法适配新的 Promise Api

Fetch Api 的特点

  1. 并非取代 AJAX,而是对 AJAX 传统 API 的改进
  2. 精细的功能分割:头部信息、请求信息、响应信息等均分布到不同的对象,更利于处理各种复杂的 AJAX 场景
  3. 使用 Promise Api,更利于异步代码的书写
  4. Fetch Api 并非 ES6 的内容,属于 HTML5 新增的 Web Api
  5. 需要掌握网络通信的知识
基本使用

请求测试地址:http://study.yuanjin.tech/api/local

使用 fetch 函数即可立即向服务器发送网络请求

参数

该函数有两个参数:

  1. 必填,字符串,请求地址
  2. 选填,对象,请求配置

请求配置对象

  • method:字符串,请求方法,默认值 GET
  • headers:对象,请求头信息
  • body: 请求体的内容,必须匹配请求头中的 Content-Type
  • mode:字符串,请求模式
  • cors:默认值,配置为该值,会在请求头中加入 origin 和 referer
  • no-cors:配置为该值,不会在请求头中加入 origin 和 referer,跨域的时候可能会出现问题
  • same-origin:指示请求必须在同一个域中发生,如果请求其他域,则会报错
  • credentials: 如何携带凭据(cookie)
  • omit:默认值,不携带 cookie
  • same-origin:请求同源地址时携带 cookie
  • include:请求任何地址都携带 cookie
  • cache:配置缓存模式
  • default: 表示 fetch 请求之前将检查下 http 的缓存.
  • no-store: 表示 fetch 请求将完全忽略 http 缓存的存在. 这意味着请求之前将不再检查下 http 的缓存, 拿到响应后, 它也不会更新 http 缓存.
  • no-cache: 如果存在缓存, 那么 fetch 将发送一个条件查询 request 和一个正常的 request, 拿到响应后, 它会更新 http 缓存.
  • reload: 表示 fetch 请求之前将忽略 http
  • 缓存的存在, 但是请求拿到响应后, 它将主动更新 http 缓存.
  • force-cache: 表示 fetch 请求不顾一切的依赖缓存, 即使缓存过期了, 它依然从缓存中读取. 除非没有任何缓存, 那么它将发送一个正常的 request.
  • only-if-cached: 表示 fetch 请求不顾一切的依赖缓存, 即使缓存过期了, 它依然从缓存中读取. 如果没有缓存, 它将抛出网络错误(该设置只在 mode 为”same-origin”时有效).
返回值

fetch 函数返回一个 Promise 对象

  • 当收到服务器的返回结果后,Promise 进入 resolved 状态,状态数据为 Response 对象
  • 当网络发生错误(或其他导致无法完成交互的错误)时,Promise 进入 rejected 状态,状态数据为错误信息

Response 对象

  • ok:boolean,当响应消息码在 200~299 之间时为 true,其他为 false
  • status:number,响应的状态码
  • text():用于处理文本格式的 Ajax 响应。它从响应中获取文本流,将其读完,然后返回一个被解决为 string 对象的 Promise。
  • blob():用于处理二进制文件格式(比如图片或者电子表格)的 Ajax 响应。它读取文件的原始数据,一旦读取完整个文件,就返回一个被解决为 blob 对象的 Promise。
  • json():用于处理 JSON 格式的 Ajax 的响应。它将 JSON 数据流转换为一个被解决为 JavaScript 对象的 promise。
  • redirect():可以用于重定向到另一个 URL。它会创建一个新的 Promise,以解决来自重定向的 URL 的响应。
Headers 对象

在Request和Response对象内部,会将传递的请求头对象,转换为Headers

Headers对象中的方法:

  • has(key):检查请求头中是否存在指定的key值
  • get(key): 得到请求头中对应的key值
  • set(key, value):修改对应的键值对
  • append(key, value):添加对应的键值对
  • keys(): 得到所有的请求头键的集合
  • values(): 得到所有的请求头中的值的集合
  • entries(): 得到所有请求头中的键值对的集合
文件上传

流程:

  1. 客户端将文件数据发送给服务器
  2. 服务器保存上传的文件数据到服务器端
  3. 服务器响应给客户端一个文件访问地址

测试地址:http://study.yuanjin.tech/api/upload

键的名称(表单域名称):imagefile

请求方法:POST

请求的表单格式:multipart/form-data

请求体中必须包含一个键值对,键的名称是服务器要求的名称,值是文件数据

HTML5 中,JS 仍然无法随意的获取文件数据,但是可以获取到 input 元素中,被用户选中的文件数据

可以利用 HTML5 提供的 FormData 构造函数来创建请求体

6 新增的数组API

静态方法
  • Array.of(…args): 使用指定的数组项创建一个新数组
  • Array.from(arg): 通过给定的类数组 或 可迭代对象 创建一个新的数组。
实例方法
  • find(callback): 用于查找满足条件的第一个元素
  • findIndex(callback):用于查找满足条件的第一个元素的下标
  • fill(data):用指定的数据填充满数组所有的内容
  • copyWithin(target, start?, end?): 在数组内部完成复制includes(data):判断数组中是否包含某个值,使用Object.is匹配

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
4月前
|
前端开发
【面试题】如何使用ES6 ... 让代码优雅一点?
【面试题】如何使用ES6 ... 让代码优雅一点?
|
4月前
|
存储 JavaScript 前端开发
【面试题】 ES6知识点详细解析(二)
【面试题】 ES6知识点详细解析(二)
|
4月前
|
前端开发 JavaScript 网络架构
【面试题】 ES6知识点详细解析(一)
【面试题】 ES6知识点详细解析(一)
216 0
|
10月前
|
自然语言处理 前端开发 Java
【ES系列八】——问题整理与总结
前端时间在团队中进行了ES的分享活动,只是将大概的内容进行了宏观的分享,以及自己在做的过程中的一些思路,但是在最后的答疑环节,伙伴们提出了一些问题,今天就针对于这些问题进行了一个简单的总结,希望能够带给读者朋友一些帮助。
|
5月前
|
前端开发 JavaScript 开发者
ES6知识点
ES6知识点
27 0
|
6月前
|
JavaScript API
ES6——知识点记录(上)
ES6——知识点记录
56 0
|
6月前
|
缓存 移动开发 前端开发
ES6——知识点记录
ES6——知识点记录
13 0
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十二天-Es8-ES8和ES9新增特性1
前端学习笔记202306学习笔记第四十二天-Es8-ES8和ES9新增特性1
39 0
|
9月前
|
前端开发
前端学习笔记202306学习笔记第四十二天-Es8-ES8和ES9新增特性2
前端学习笔记202306学习笔记第四十二天-Es8-ES8和ES9新增特性2
41 0
|
前端开发
4 分钟再快速过一遍 ES12 的 5 个要点~
数字分隔符是数字之间添加的下划线,这使得数字更可读;当代码解析时,下划线会被自动去除;