async和await

本文详细介绍了JavaScript中async/await的使用方法、返回值及其处理错误的方式。async函数用于声明异步函数,await用于等待Promise结果。当await后的Promise解析时,后续代码将按顺序执行;如果Promise被reject,可以通过try...catch捕获错误。同时,文章提供了一个面试题,解释了在await非Promise表达式时的行为,强调了await并非总是等待异步操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

async await是用于声明异步函数的。 async 用于修饰函数,await只能在带了async的函数内使用。

一. 使用方法

const func = async function() { console.log(123); const a = await new Promise((resolve) => { resolve(2); }) console.log(a); console.log(3); } func(); 执行结果:

image.png

我们通常用这种方法去改变promise的执行顺序,等得到promise的执行结果之后再执行下面的同步代码。

二. 返回值

### 1. async函数的返回 开头我们说了async用来修饰函数,让函数变成一个异步函数。 image.png

他的返回值也是一个promise,所以这个函数的执行返回是可以用promise的then()和catch()方法的。 ``` (async function() { return 123; })().then(res => {console.log(res)}) // 123

(async function() { return new Promise(resolve => resolve(123)) })().then(res => {console.log(res)}) // 123

```

2. 被await的promise的返回结果

await就是为了等待promise执行结果后才执行函数内后面代码的。

当如果被等待的promise,resolve了一个结果后,我们将会正常开始执行函数后面的代码。 (async function() { const a = await new Promise(resolve => resolve(123)) console.log(a); console.log(456); })() // 123 // 456

当被等待的promise,reject了一个错后,将会报错并不再执行后面的代码。 (async function() { const a = await new Promise((resolve,reject) => reject(123) ) console.log(a); console.log(456); })() 执行结果:

image.png

那么当没有结果呢 (async function() { const a = await new Promise((resolve,reject) => {return 123} ) console.log(a); console.log(456); })() 结果什么都没有打印,这说明如果promise没有结果,那么await之后的语句也不再执行。

3.如何处理错误

通过上面reject的例子可以发现如果被等待的promise报错,会阻碍下面代码的执行,所以我们有必要处理这些错误,让成功和错误后都能有相应的代码能处理这个结果,那我们就可以用try去处理这个promise,如下例,我们模拟出错的情况处理错误: ``` (async function() { try { const a = await new Promise((resolve,reject) => reject(123)) console.log("我成功了!") } catch(err) { console.log('我出错了,但我不想管!', err); } console.log(456);

})() ``` 执行结果: image.png

三. 有关面试题

其实这个博客是我看到有人问了一个题后想写的,暂时也没想到太多的题,就贴一下那个题吧,后面想到合适的题,再贴过来。 function log(time){ setTimeout(function(){ console.log(time); return 1; },time) } async function funccc(){ let a = await log(1000); let b = await log(3000); let c = log(2000); console.log(a); console.log(1) } funccc(); 这个题里面的await就是来误导的,在await后面不是一个promise的时候,是不会去等待其执行完成的. 所以其实这个问题就很简单,前面介个setTimeout存入队列,先执行,a,1,这个时候,a已经定义,但是没有初始值,所以就是undefined,执行完后,再执行队列中的值,也是不会相互等待哦,依次执行下来,就是1000,2000,3000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值