ES8 学习 -- async 和 await / 对象方法扩展 / 字符串填充

news2024/10/6 4:02:45

文章目录

  • 1. async 和 await
    • 1.1 基本语法
    • 1.2 使用示例
    • 1.3 案例练习
  • 2. 对象方法扩展
    • 2.1 Object.values(obj)
    • 2.2 Object.entries(obj)
    • 2.3 Object.getOwnPropertyDescriptors(obj)
      • 使用示例
  • 3. 字符串填充
  • 4. 函数参数的末尾加逗号

1. async 和 await

async 函数,使得异步操作变得更加方便。

  • 更好的语义。
  • 返回值是Promise。

1.1 基本语法

async function test(){
let res = awiat … // 对象
})
}

async function test(){
console.log("test")
// return "sucess-11111111"
return new Promise((resolve,reject)=>{
// resolve("data-11111")
reject ("err-22222")
})
}
let res = test()
// console.log(res)
res.then(res=>{
console.log("success",res)
})catch(err=>{
console.log("err",err)
)

// test
// err err-22222

根据以上代码我们可以得出:

  1. async返回值是非promise对象时,返回值一定是fulfiled状态,指定执行then();
  2. async返回的是promsie对象时,我们要个人句返回的promsie对象判断fulfilled 和 rejected两种状态,接着再进行判断执行then() 还是catch()。

async 和 await只能搭配着成对出现!

1.2 使用示例

function ajax(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log("ajax-成功")
resolve("data-11111")
},1000)
})
}
async function test(){
// await后面可以接非promise对象,或者promise对象
// let res = await {name:"kerwin"}  //{name:kerwin}
// let res = ajax()
let res = await ajax()
console.log(res)
test()

没有使用await 时:
// Promise{}
// ajax-成功

使用await 时:
// ajax-成功
// data-11111
// 这段代码是在 1s 之后才出现的!

为什么代码在 1s 之后才出现呢?这是因为使用await 时,如果异步结果不传给res ,那么程序就会在此等着,不去执行下面的程序。

如果某块代码出现错误时,代码就会直接跳到catch() 处,而不会继续执行下面的代码。

一般情况下我们的代码执行顺序就入下面所示,在then() 中渲染页面,在catch() 中处理错误:

async function test(){
... // 与上边代码一样
}
test().then(res=>{
console.log(res)
// 渲染页面
}).catch(err=>{
console.log("err",err)
// 处理错误
})

但是我们也有另一种写法:
我们可以直接在方法中渲染页面,同时写try…catch… 用来处理错误。

async function test()
// await后面可以接非promise对象,或者promie对象
// let res = await {"name":"Kerwin"}
try {
let res1 = await ajax1()
console.log(res1)
let res2 = await ajax2(res1)
console.log(res2)
// 渲染页面
console.log("渲染页面")
catch (error){
console.log("err",error)
}
}

1.3 案例练习

function ajax(url){
return new Promise((resolve,reject)=>{
let xhr = new XMLHttpRequest()
xhr.open("get",url,true)
xhr.send()
xhr.onreadystatechange = function(){
if(xhr.readystate === 4){
if(xhr.status >= 200 && xhr.status < 300){
resoLve(JSON.parse(xhr.responseText))
}else{
reject(xhr.responseText)
}
}
}
})
async function test(){
// let res = await ajax("1.json")
// console.log(res)
// let res2 = await ajax("2.json")
// console.log(res2)

//promise.all
let res = await Promise.all([ajax("1.json"),ajax("2.json")])
}
test()

2. 对象方法扩展

2.1 Object.values(obj)

let obj = {
name:"kerwin",
age:100
}
console.log(object.values(obj))

// (2) [‘kerwin’,100]

2.2 Object.entries(obj)

let obj = {
name:"kerwin",
age:100
}
console.log(object.entries(obj))

// (2) [‘kerwin’,100]

let obj = {
name:"kerwin",
age:100
}
let m = new Map(object.entries(obj))
console.log(m)

在这里插入图片描述

2.3 Object.getOwnPropertyDescriptors(obj)

该方法可以用来复制对象,当对象中存在拦截属性的方法时,我们使用object.assign() 就不灵了(object.assign() 只能复制属性和简单方法,具有拦截属性的方法就不能被复制)。所以此时我们选择使用Object.getOwnPropertyDescriptors(obj)。

拦截属性函数中我们一般不会去拦截对象的现有属性,比如说下面的代码中我们使用get() 获取this.name ,当程序运行时会不断调用get() ,程序一直在循环进行,但是得不到结果;
我们一般会转换方式的到对象的现有属性,这样可以解决对现有属性依赖问题。

let obj = {
name:"kerwin",
age:100,
// get name() {
// console.log("get")
// return this.name
// }
get uppername(){
console.log("get")
return this.name.substring(0,1).toUppercase()+this.name.substring(1)
}
set uppername(value){
console.log("set",value)
this.name = value
}
}

使用示例

使用Object.assign( ) :

let obj1 ={ }
Object.assign(obj1,obj)

在这里插入图片描述

let obj1 ={ }
Object.defineProperties(obj1,object.getownPropertyDescriptors(obj))

在这里插入图片描述

3. 字符串填充

let str = "kerwin"
console.log(str.padstart(10,'x'))
console.log(str.padEn(10,'x'))
console.log(str.padstart(5,'x'))
console.log(str.padEnd(5,'x'))

// xxxxkerwin
// kerwinxxxx
// kerwin
// kerwin

一般用于设置时间格式

let list = [
for(let i = 1;i < 13 ;i++)
// list.push(String(i).padstart(2,"0"))
list.push((i+"").padstart(2,"0"))

4. 函数参数的末尾加逗号

function test(
a,
b,
C,
){
console.log(a,b)
}
test(
1,
2,
3,
)

一般是让gate 中修改完代码后想看看修改完和修改前的区别。(了解一下就行)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式硬件】光耦

1.光耦作用 光耦一般用于信号的隔离。当两个电路的电源参考点不相关时,使用光耦可以保证在两边不共地的情况下,完成信号的传输。 2.光耦原理 光耦的原理图如下所示,其内部可以看做一个特殊的“三极管”; 一般的三极管是通过基极B和发射极E间的电流,去控制集电极C和发射极…

图像处理与视觉感知---期末复习重点(6)

文章目录 一、图像分割二、间断检测2.1 概述2.2 点检测2.3 线检测2.4 边缘检测 三、边缘连接3.1 概述3.2 Hough变换3.3 例子3.4 Hough变换的具体步骤3.5 Hough变换的法线表示形式3.6 Hough变换的扩展 四、阈值处理4.1 概述4.2 计算基本全局阈值算法4.3 自适应阈值 五、基于区域…

视频汇聚/安防监控/EasyCVR平台播放器EasyPlayer更新:新增【性能面板】

视频汇聚/安防监控/视频存储平台EasyCVR基于云边端架构&#xff0c;可以在复杂的网络环境中快速、灵活部署&#xff0c;平台视频能力丰富&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云…

128Days

今天是我踏上创作之路的第128天&#xff0c;回首过去的这些日子&#xff0c;心中充满了感慨和喜悦。我想&#xff0c;每一个热爱创作的人&#xff0c;都会珍惜自己走过的每一天&#xff0c;因为每一天都充满了新的灵感和挑战。 从最初的懵懂无知&#xff0c;到现在对创作的热情…

CTF wed安全 (攻防世界)练习题

一、disabled_button 步骤一&#xff1a;进入网站发现按钮按不了 步骤二&#xff1a;按F12会查看源代码&#xff0c;会发现disabled disable属性 在HTML中&#xff0c; disabled 属性只有两个值&#xff1a;一个是不带值&#xff08;例如&#xff1a;disabled&#xff09;&…

基于单片机和PCF8591波形发生器可调系统设计

**单片机设计介绍&#xff0c;基于单片机和PCF8591波形发生器可调系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机和PCF8591的波形发生器可调系统设计是一个结合了硬件与软件技术的综合性项目。这种设计旨在通…

【机器学习300问】61、逻辑回归与线性回归的异同?

本文讲述两个经典机器学习逻辑回归&#xff08;Logistic Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;算法的异同&#xff0c;有助于我们在面对实际问题时更好的进行模型选择。也能帮助我们加深对两者的理解&#xff0c;掌握这两类基础模型有助…

uniapp:小程序腾讯地图程序文件qqmap-wx-jssdk.js 文件一直找不到无法导入

先看问题&#xff1a; 在使用腾讯地图api时无法导入到qqmap-wx-jssdk.js文件 解决方法&#xff1a;1、打开qqmap-wx-jssdk.js最后一行 然后导入&#xff1a;这里是我的路径位置&#xff0c;可以根据自己的路径位置进行更改导入 最后在生命周期函数中输出&#xff1a; 运行效果…

2024年网络安全趋势前瞻:从AI攻击到云安全新挑战

随着2024年开展新的序幕&#xff0c;网络安全领域正面临着前所未有的挑战与机遇&#xff0c;一系列引人注目的趋势和预测逐渐浮出水面。 一、AI技术发展引发的安全问题 近年来&#xff0c;我们见证了AI技术的飞速进步&#xff0c;其中ChatGPT等引领潮流的AI服务成为公众瞩目的…

C++语言学习(二)——⭐缺省参数、函数重载、引用

1.⭐缺省参数 &#xff08;1&#xff09;缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…

Transformer - model architecture

Transformer - model architecture flyfish Transformer总体架构可分为四个部分: 输⼊部分 输出部分 编码器部分 解码器部分 输入部分 输出部分 输⼊部分包含: 源嵌⼊层和位置编码 ⽬标嵌⼊层和位置编码 输出部分包含: 线性层 softmax处理器 左侧编码器部分和右侧解码器部…

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中&#xff0c;.rmallox勒索病毒以其独特的传播方式和强大的加密能力&#xff0c;给广大用户带来了极大的困扰。本文…

图论模板详解

目录 Floyd算法 例题&#xff1a;蓝桥公园 Dijkstra算法 例题&#xff1a;蓝桥王国 SPFA算法 例题&#xff1a;随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题&#xff1a;聪明的猴子 Floyd算法 最简单的最短路径算法&#xff0c;使用邻接…

解决nginx代理后,前端拿不到后端自定义的header

先说结论&#xff0c;因为前端和nginx对接&#xff0c;所以需要在nginx添加如下配置向前端暴露header add_header Access-Control-Expose-Headers Authorization 排查过程 1.后端设置了Authorization 的响应头作为token的返回&#xff0c;前后端本地联调没有问题 response.s…

单元测试——Junit (断言、常用注解)

单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中&#xff0c;"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值&#xff0c;index…

计算机网络-HTTP相关知识-HTTPS基础

HTTPS与HTTP的区别 在TCP和HTTP网络层之间加入了SSL/TLS安全协议。HTTPS在TCP三次握手之后&#xff0c;还需进行SSL/TLS的握手过程。HTTP默认端口号是80&#xff0c;HTTPS默认端口号是443。 HTTPS解决的风险 HTTPS主要解决了以下三种风险&#xff1a; 窃听风险&#xff1a;H…

4.2作业

1、使用模板类&#xff0c;实现顺序栈 #include <iostream>using namespace std;template<typename T> class Stack {T *data;T top;T size; public://构造函数Stack():size(7){data new T[size];top -1;cout << "Stack的无参构造" << en…

Transformer - Positional Encoding 位置编码 代码实现

Transformer - Positional Encoding 位置编码 代码实现 flyfish import torch import torch.nn as nn import torch.nn.functional as F import os import mathclass PositionalEncoding(nn.Module):def __init__(self, d_model, dropout, max_len5000):super(PositionalEnco…

加速科技高性能数模混合信号测试设备ST2500EX精彩亮相SEMICON China 2024

芯片是现代信息技术发展的重要支柱&#xff0c;半导体设备则是芯片产业发展的重要基石。近年来&#xff0c;半导体设备领域开启了国产自研的黄金浪潮&#xff0c;其中&#xff0c;测试机作为芯片测试中至关重要的核心设备之一&#xff0c;国产自研率较低&#xff0c;一直是国内…

基于深度学习的商品标签识别系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文深入研究了基于YOLOv8/v7/v6/v5的商品标签识别&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streamlit的交…