Skip to content

ES2020

babel 7.8以上可以使用 ES2020

一、Promise.allSettled()

ES6 中的 Promise.all()有点简陋,只要其中一个失败,就全部失败

ES2020 新增 Promise.allSettled(),可以返回每一个 Promise 的结果和状态

通过Promise.reject(错误内容)来模拟Promise.all遇到一个异步报错情况

js
async test(){
const res = await Promise.all([

Promise.resolve({code:200,msg:"请求成功"}),

Promise.resolve({code:200,msg:"请求成功"}),

Promise.reject({code:500,msg:"请求失败"})
]).catch(err=>console.log(err))
if(res){

//数据操作
}}

all 只要有一个报错,就会走到 catch 中,成功的请求也不会暴露出来使用。 走到 catch 的 err 就是 reject 的错误内容

Promise.allSettled()的返回结果,是每个Promise请求的状态及结果内容

js
async test(){
const res = await Promise.allSettled([

Promise.resolve({code:200,msg:"请求成功"}),

Promise.resolve({code:200,msg:"请求成功"}),

Promise.reject({code:500,msg:"请求失败"})
])
console.log(res)
const successList = res.filter(item=>item.status!==\'rejected\')
const errorList = res.filter(item===item.status===\'rejected\')
errorList.forEach(item=>alert(item.reason.msg))
successList.forEach(item=>{

// 数据操作

// item.value.msg
})}

promise.allSettled() 成功失败都会走 then,用await则都会往下走不像all()那样把成功放then失败放catch,用 await 就会卡住不往下走成功失败都会返回成一个对象数组,并带有状态status属性,如下res 的值是

js
[
{status:"fulfilled", value:{code:200,msg:"请求成功"},
{status:"fulfilled", value:{code:200,msg:"请求成功"},
{status:"rejected", reason:{code:500,msg:"请求失败"}]

因此可以灵活操作成功和失败的Promise(通过数组筛选方法)

js
const successList = res.filter(item => item.status !== "rejected");const errorList = res.filter((item === item.status) === "rejected");errorList.forEach(item => alert(item.reason.msg));successList.forEach(item => {
// 数据操作
// item.value.msg});

二、可选链

ES6 中通过短路运算符 &&可以简化很多代码,但是大量链式短路运算符依然冗余

js
const vipLevel = res.userInfo && res.userInfo.vip;

通过可选链?.的形式,可以简化再写一次父级对象的写法

js
const vipLevel = res?.userInfo?.vip;

三、空值合并运算符

ES6 中|| 或运算符 前面的值判定为 false 就会执行后面有时候,数字 0空字符串,希望不执行后面而是取原值,再 ES6 中的写法就是不用||,而是用是否===undefinded 来判断 ES2020 空值合并运算符 ??就不会把数字 0空字符串判定为 false

js
const vipLevel = res.userInfo.vip || "暂无等级"; // 0级应该执行前面,这样写会执行后面
const vipLevel = res.userInfo.vip ?? "暂无等级"; // 0和空字符串会执行前面

四、?.??结合使用

结合上面 2 种语法(可选链、空值运算符)

js
const vipLevel = res?.userInfo?.vip ?? "暂无等级"; // 0和空字符串会执行前面

五、统一全局变量

node 全局变量 global web 全局变量 window、self两者都可以通过this 来作全局变量,但是很危险,因此不建议 web 一般用 window self 在 serviceWorker 的时候用到(也可以用 this,不推荐)globalThis