ES2020
babel 7.8
以上可以使用 ES2020
一、Promise.allSettled()
ES6 中的 Promise.all()有点简陋,只要其中一个失败,就全部失败
ES2020 新增 Promise.allSettled(),可以返回每一个 Promise 的结果和状态
通过Promise.reject(错误内容)
来模拟Promise.all
遇到一个异步报错情况
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
请求的状态及结果内容
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 的值是
[
{status:"fulfilled", value:{code:200,msg:"请求成功"},
{status:"fulfilled", value:{code:200,msg:"请求成功"},
{status:"rejected", reason:{code:500,msg:"请求失败"}]
因此可以灵活操作成功和失败的Promise
(通过数组筛选方法)
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 中通过
短路运算符 &&
可以简化很多代码,但是大量链式短路运算符依然冗余
const vipLevel = res.userInfo && res.userInfo.vip;
通过可选链
?.
的形式,可以简化再写一次父级对象的写法
const vipLevel = res?.userInfo?.vip;
三、空值合并运算符
ES6 中
|| 或
运算符 前面的值判定为false
就会执行后面有时候,数字 0
、空字符串
,希望不执行后面而是取原值,再 ES6 中的写法就是不用||
,而是用是否===undefinded
来判断 ES2020空值合并运算符 ??
就不会把数字 0
,空字符串
判定为 false
const vipLevel = res.userInfo.vip || "暂无等级"; // 0级应该执行前面,这样写会执行后面
const vipLevel = res.userInfo.vip ?? "暂无等级"; // 0和空字符串会执行前面
四、?.
、??
结合使用
结合上面 2 种语法(可选链、空值运算符)
const vipLevel = res?.userInfo?.vip ?? "暂无等级"; // 0和空字符串会执行前面
五、统一全局变量
node 全局变量
global
web 全局变量window、self
两者都可以通过this 来作全局变量,但是很危险,因此不建议 web 一般用window
self 在serviceWorker
的时候用到(也可以用 this,不推荐)globalThis