ES6学习笔记(十六)async函数

CST微带贴片天线设计全流程:从S11优化到辐射方向图分析 微带贴片天线是现代无线通信设备中的关键部件,其设计依赖于电磁场理论与仿真软件的结合。理解天线的基本工作原理,如谐振频率、阻抗匹配和辐射机制,是进行有效设计的基础。通过电磁仿真,工程师可以精确预测天线性能,避免传统手工计算的误差。在工程实践中,CST Studio Suite作为行业标准的三维电磁仿真工具,能够高效处理复杂的边界条件与材料属性,帮助优化S11参数和辐射方向图。本文聚焦于2.4GHz Wi-Fi频段微带贴片天线的完整设计流程,详细解析了端口设置、网格划分等关键步骤,并针对常见的仿真失败问题提供了 阅读详情

async函数简介


async函数简单来说就是Generator函数的语法糖,可以看成多个异步操作包装成的Promise对象。相比较于Generator函数,async函数多了几个改进的地方

1.内置执行器

在使用Generator函数时,我们需要自己设置一个执行器,但是async自带执行器,在使用时与普通函数一样只需要函数名和括号来传入参数。

2.更好的语义

相对于Generator函数的声明,async的声明其实很像,但更符合语义,看看下面两个函数

//Generator函数

function* gen(){

    yield 1;

}

//async函数

async function gen(){

    await 1;

}

async函数只是将*改成async,把yield改成await。

3.返回值是Promise对象

Generator函数返回的是Iterator对象,而async函数返回的是Promise对象,使用then方法来指定下一步操作,比Iterator对象使用next方便。

async函数的使用


async函数在使用时,会直接执行函数体的内容,遇到await语句时,会先返回Promise对象,执行完该await语句后再继续执行后面的内容。

async function asy(){
    console.timeline();
    await new Promise(resolve=>setTimeout(()=>{
        resolve();
        console.log(1);
    },3000));
    setTimeout(()=>{
        console.log(2);
        console.timelineEnd();
    },1000);
}

asy()

// 1

// 2

// Timeline 'default': 4003.81005859375ms

上面代码中,1是3秒后才打印,2是1秒后打印,在一般函数中,2会先打印,但因为在async函数中,需要等到await语句后面的内容执行完后才会执行下面的内容,所以这里先要等到await后面的Promise对象转换为resolve状态后才能继续执行下面的内容,所以这里2其实是4秒后才打印。从使用console.timelineEnd打印出的时间也能看出。

async函数的语法


返回Promise对象

async函数返回的是一个Promise对象,即最后return的内容会变为then方法的resolve方法的参数,而抛出的错误会被catch方法捕获。

async function asy(){

    return 'i am promise';

}

asy().then(val=>console.log(val))

// i am promise



async function asy(){

    throw new Error('i throw error');

}

asy().then().catch(e=>console.log(e))

// Error: i throw error

async函数返回的Promise对象状态的改变需要等到async函数中所有await语句后面的Promise对象转换完才会改变,除非遇到return语句或者抛出错误。

async function asy(){

    await new Promise((resolve)=>setTimeout(resolve,2000));

}

console.timeline();

asy().then(()=>{

console.log('complete');

console.timelineEnd();

})

//complete

// Timeline 'default': 2001.083251953125ms

从打印出来的时间可以看出,complete是在两秒后才打印出来的,即是等到里面的Promise对象转换为resolve状态才转换的。

await命令

正常情况下,await命令后面是一个Promise对象,若不是Promise对象,则直接返回该值。

async function asy(){

    return await 'not promise';

}

asy().then(val=>console.log(val))

// not promise

如上面代码,后面的字符串不是Promise对象,所以直接将该值return出来,作为resolve方法的参数。

当然,thenable对象一样会被当成Promise对象处理(带then方法的对象)。

var obj={

    then(resolve){

        setTimeout(()=>{

            resolve();

            console.log('thenable');

        },1000)

    }

}

async function asy(){

    await obj;

    console.log('async');

}

asy().then(()=>console.log('promise'))

Promise {<pending>}

// thenable

// async

// promise

上面代码可以看到,虽然obj对象里面的then方法的console语句是在1秒后执行的,但’thenale’字符串还是在’promise’字符串之前打印出来,说明await将obj对象当成Promise对象处理。

要注意的是,如果async函数中有一个Promise对象转换为rejected状态,整个函数会终止执行。

async function asy(){

    await Promise.reject('error');

    await Promise.resolve('continue');

console.log('complete');

}

asy().then(val=>console.log(val)).catch(e=>console.log(e))

// error

上面代码中,因为第一个Promise对象变为rejected状态,所以后面的内容都没有执行了。为了避免这种情况,一般将可能会出错或者变为rejected状态的Promise对象放在try...catch语句块中,或者在其后面调用catch方法。

async function f() {

  try {

    await Promise.reject('出错了');

  } catch(e) {

  }

  return await Promise.resolve('hello world');}

f().then(v => console.log(v))

// hello world



async function f() {

  await Promise.reject('出错了')

    .catch(e => console.log(e));

  return await Promise.resolve('hello world');}

f().then(v => console.log(v))

// 出错了

// hello world

如上面代码,在转为rejected状态的Promise对象后面的语句依然能执行。

使用注意点


1.使用async函数时,因为其中的await语句后面的Promise对象可能会变为rejected状态,所以最好将其放在try...catch语句中。

2.多个异步操作执行时,若其执行的顺序与最终结果无关,最好让它们同时触发。

// 按顺序执行的写法

let foo = await getFoo();

let bar = await getBar();

// 同时触发

// 写法一

let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二

let fooPromise = getFoo();

let barPromise = getBar();

let foo = await fooPromise;

let bar = await barPromise;

3.await命令只能在async函数中使用,若在其他地方使用会报错。

function normal(){

await 1;

}

// Uncaught SyntaxError: await is only valid in async function

4.async函数可以保留运行堆栈

const a = () => {

  b().then(() => c());

};

上面代码中,a内部执行了一个异步方法b,但是在b开始执行时,a并不会停止执行,等到c执行时,a可能已经停止了。b所在的上下文环境已经不在了,若b()或c()报错,错误堆栈将不包括a()。

执行原理


async函数的执行原理,其实就是将Generator函数和自动执行器包装在一个函数里。

async function fn(args) {

  // ...

}

// 等同于

function fn(args) {

  return spawn(function* () {

// ...  

});}

参考自阮一峰的《ECMAScript6入门》


ES6学习笔记目录

 

ES6学习笔记(一)let和const

ES6学习笔记(二)参数的默认值和rest参数

ES6学习笔记(三)箭头函数简化数组函数的使用

ES6学习笔记(四)解构赋值

ES6学习笔记(五)Set结构和Map结构

ES6学习笔记(六)Iterator接口

ES6学习笔记(七)数组的扩展

ES6学习笔记(八)字符串的扩展

ES6学习笔记(九)数值的扩展

ES6学习笔记(十)对象的扩展

ES6学习笔记(十一)Symbol

ES6学习笔记(十二)Proxy代理

ES6学习笔记(十三)Reflect对象

ES6学习笔记(十四)Promise对象

ES6学习笔记(十五)Generator函数

ES6学习笔记(十六)asnyc函数

ES6学习笔记(十七)类class

ES6学习笔记(十八)尾调用优化

ES6学习笔记(十九)正则的扩展

ES6学习笔记(二十)ES Module的语法

 

 

 

视频倍速 - 在线调倍速的加速器APP工具 一刀工具箱APP提供一键可将手机上的视频倍速播放,可以调整视频倍速的加速器,调节视频的速度也就是调节视频的播放速度!一键可将手机上的视频倍速播放,可以调整视频倍速的加速器,调节视频的速度也就是调节视频的播放速度!视频倍速-在线调倍速的加速器-一刀工具箱APP。... 阅读详情

相关推荐

Gröbner基方法入门第I部分:项序和约化

Gröbner基方法入门第I部分:项序和约化 理想的准素分解与矩阵分解是计算代数的核心问题,它们在计算机代数、计算代数几何、代数编码和密码学、多维系统理论等学科都有非常重要的理论意义与应用价值.Gröbner基理论是研究理想的准素分解与矩阵素分解的重要工具之一.更简单地概括:Gröbner基方法是从任意一个多项式理想的一组给定生成元,计算另一组性质良好的生成元,并称为该理想的Gröbner基.它能用来判定任意多项式是否属于该理想. Gröbner基的代数算法是Buchberger在1960年代开发的,并

MinCong Luo的博客 4265

理解Javasript中的Promise、asnyc与await之间的关系

从一句 “await必须在asnyc函数中使用,await后面接的是Promise对象”中大致可以看出他们三者的关系,即await是asnyc的衍生品,用来处理Promise对象。 1、Promise对象 官方解释: Promise是一个对象,它代表了一个异步操作的最终完成或者失败。因为大多数人仅仅是使用已创建的 Promise 实例对象,所以本教程将首先说明怎样使用 Promise,再说明如何创建 Promise。 本质上Promise是一个函数返回的对象,我们可以在它上面绑定回调函数...

Fifty-three的博客 886

HDMI2.1/eDP TX接口设计:

HDMI2.1向下兼容,HDMI2.1工作在FRL模式,HDMI2.0工作在TMDS模式。因此采用AC耦合电压模式驱动器。一般采用220nF,封装建议0201。,但是协议要求,往 CEC 管脚通过 27K 电阻加 3.3V 电压,漏电不允许超过。NOTE:如果只需要支持 HDMI2.0 及以下模式时, MOS管也不能省掉。DDC_SCL/DDC_SDA 协议规定是。HDMI2.0模式:配置为高,MOS导通。HDMI2.1模式:配置为低,MOS不导通。,必须增加电平转换电路。形成直流偏置,大约3V。

qq_40010777的博客 7859

ES6(十八)asnyc 和 await

async 和 awaitasync 含义async 基本用法async 基本语法Promise 状态变化await 命令错误处理async 函数的基本原理与其他异步方法的对比总结 async 含义 async 函数是什么?一句话,它就是 Generator 函数的语法糖。 语法糖 指 计算机语言 中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。. 语法糖让程序更加简洁,有更高的可读性,比如Vue中的 @ 、: const fs = require('fs'); const r

qq_51005544的博客 1107

XIAO ESP32S3 Sense摄像头与麦克风实战:从硬件连接到AI语音视觉项目

本文详细介绍了如何使用Seeed Studio XIAO ESP32S3 Sense开发板进行AI语音视觉项目开发。从硬件连接到Arduino环境搭建,再到摄像头拍照、视频流传输、麦克风录音等实战操作,最后引导读者探索基于TensorFlow Lite Micro的语音唤醒和SenseCraft AI的图像识别等AI应用,为物联网和边缘AI项目提供了完整的入门指南。

xray4的博客 1024

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1294

C# asnyc和await

异步编程是一种编程范式,C#中的异步编程可以通过Thread,TheadPool,Task,async/await等来实现。await必须等待结果,没结果不能等待(无法等待void),要求:Task或其它的异步方法必须有返回值。单独使用async,不使用await,警告缺少 await运算符,不是真正的异步方法。不能等待同步代码,只能等待Task或异步方法,且异步方法必须有返回值,但Await不能等待同步代码,只能等待task或异步方法。异步方法没有返回值,不可以等待,不等待时,异步执行。

去追随使你安宁的东西,去做你觉得有用的事情 1337

吊打原版YOLOv8!ASF-YOLO多尺度融合+注意力机制实战解析(遥感/医疗/质检均适用)

ASF-YOLO融合YOLOv8的创新目标检测框架摘要 ASF-YOLO是针对小目标检测优化的先进框架,采用三重特征编码器和尺度序列融合技术增强多尺度特征提取能力。核心创新包括: 三重特征编码器(TPE)融合跨层级信息 尺度序列特征融合(SSFF)模块通过3D卷积处理多尺度信息 通道-位置注意力机制(CPAM)聚焦关键特征区域 Zoom_cat模块实现自适应多尺度特征融合 该框架特别适用于医学影像、遥感检测等小目标密集场景,通过动态特征权重调整显著提升检测精度。关键技术实现包含多尺度特征统一、3D卷积序列处

FJN110的博客 527

10.Async异步函数

asnyc函数实际上是+的语法糖 上述代码修改成async函数 2.基本用法 async函数返回一个对象,可以使用then方法进行回调。当函数执行遇到await就会先返回,等异步操作完成后,在接着执行函数体后面的语句 3.async声明方式 4.async本质上是Promise async函数结束return的参数会封装成为一个,状态为,因为 同理,throw抛出错误会返回一个,状态为 返回的Promise对象,必须等到await命令后面的Promise对象执行完,才会发生状态改变,意味着必须等到

Xiaoyc7的博客 1055

【OS】AUTOSAR架构下MCAL Modules软件分区问题分析

AUTOSAR架构下MCAL Modules软件分区问题分析

qq_36056498的博客 939

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1025

<script> 标签的 defer 和 asnyc 属性的作用以及二者的区别

在现代Web开发中,JavaScript的使用几乎是不可避免的。随着Web应用变得越来越复杂,JavaScript文件的大小也在不断增长。为了提高页面加载性能,浏览器提供了async和defer两个属性,用于改变浏览器加载和执行JavaScript文件的方式。理解这两个属性的作用和区别对于优化页面加载时间和用户体验至关重要。

A12536365214的博客 367

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 547

初学ES6笔记十六async函数

本人的笔记内容来自于[阮一峰老师的ECMAScript 6 详细内容请看(http://es6.ruanyifeng.com/#docs/array) async函数 一、含义 async 函数是它就是 Generator 函数的语法糖,它使异步操作变得更加方便。 有一个 Generator 函数,依次读取两个文件。 const fs = require('fs'); const readFil...

weixin_44072887的博客 278

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ES6(十六)async 函数

async 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async 函数是 Generator 函数的语法糖。 什么是语法糖? 意指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。 反向还有语法盐: 主要目的是通过反人类的语法,让你更痛苦的写代码,虽然同样能达到避免代码书写错误的效果,但是编程效率很低,毕竟提高了语法学习门槛,让人齁到忧伤。。。

weixin_44959855的博客 208

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JavaScript进阶(二十六):ES各版本特性详解

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,所以它可以理解为是JavaScript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。

IT全栈 华强工作室 4887

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ES6学习笔记(二)(feat阮一峰ES6教程)

**内容简介:** 十二、Symbol 十三、Set 和 Map 数据结构 十四、Proxy 十五、Reflect 十六、Promise 对象 十七、Iterator 和 for...of 循环 十八、Generator 函数的语法 十九、Generator 函数的异步应用 二十、async 函数 二十一、Class 的基本语法 二十二、Class 的继承 二十三、Module 的语法 二十四、Module 的加载实现 二十七、异步遍历器

weixin_43995977的博客 861

ES6-11 学习笔记

学习ES5-11S时候做的笔记,第一遍过注重各个新特性的用法,实际案例在将来开发中遇到将会补充上来

m0_60394632的博客 424

ES6——ES6相关面试题分享

本文主要介绍了些关于ES6的相关面试题

Bonsoir777的博客 4063

ES6-ES11

ES6-ES11新特性

Do_ris的博客 1187

重学ES6基础

一 目录 目录 一 目录 二 前言 三 let & var & const 四 块级作用域 五 解构赋值 六 展开运算符 七 Set 八 Map 九 新增函数拓展 十 新增数组拓展 十一 新增字符串拓展 十二 新增对象拓展 十三 Babel 十四 ES6 高级 - 异步专题 十五 ES6 高级 - MVVM 十六 总结 十七 参考文献 二 前言 返回目录 ECMAScript 2015,简称 ES6。 E

weixin_43956521的博客 527

ES6总结

ES6大致内容总结

weixin_42727450的博客 712

es6学习笔记(三)

1、async await   nodejs读取文件 fs.readFile()   es6读取文件: async function fn(){ //async表示异步 await readFile(url); //await表示等待 }   await只能放在async函数中   async相比generator语义化更强   await后可以是一个pr...

Sony0603的专栏 170

Es6进阶

当属性值是对象时,源对象中的对象会直接覆盖目标对象中同名的对象属性(实际上是复制引用),后续对这个对象属性内部属性的修改,会同时影响到目标对象和源对象中该属性指向的对象。● 利用 ES6 的类和继承:ES6 引入了类的概念,通过继承可以创建一个新类,该类不仅拥有自己定义的方法,还能继承父类的方法,也可以重写父类方法或添加新方法来扩展功能。● 目标对象与源对象有同名属性:当使用 Object.assign() 合并对象时,如果目标对象和源对象存在相同的属性名,源对象的属性值会覆盖目标对象的属性值。

2401_87845453的博客 1200

JavaScript学习笔记(三十六)——async和await

上一篇文章中,我们使用Promise处理异步行为,虽然我们的代码已经改观了很多了,基本已经可以维护了,但是对于一个程序员来说,这个样子是不够的。我们还需要更加的简化代码,所以我们就需要用到一个 es7 的语法了,叫做 async/await async async关键字用于定义异步函数(其实是Generator的语法糖) 定义:放在function关键字之前,表示“这是一个内部有异步行为的函数” async function aa() { console.log(1);

qq_45268602的博客 241

ES6 现代 JavaScript 速查手册:从 ES2015 到 ES2020 的新特性全解析

本速查手册以 [source/_posts/es6.md](https://link.gitcode.com/i/d0c20f930cccafa130afa23ce8c68ab6) 为骨架,系统梳理 JavaScript 自 ES2015(ES6)以来引入的块级作用域、模板字符串、解构赋值、展开运算符、箭头函数、Class 类、Promise 异步编程、ES Module 模块系统与生成器等核心新

gitblog_00761的博客 251
上一篇: ES6学习笔记(十五)Generator函数
下一篇: ES6学习笔记(十七)类class
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值