es6学习之async和await关键字
await关键字
await关键字只能在async函数中使用,如果再没有async的函数中使用就会报错。
- await关键字会暂停当前async函数的执行,等待promise处置完成。
- 如果promise正常处理则会返回promise中的resolve的值。
- 如果处理失败会把promise的异常原因抛出。
- 如果await操作符的表达
- +式不是一个promise.则返回该值的本身。
async function demo1() { let reslut = await Promise.resolve('处理成功!') return reslut; } async function demo2() { try { let reslut = await Promise.reject('处理失败!') return reslut; } catch (e) { console.log("e:" + e); return e; } } async function demo3() { let reslut = await "返回正常值"; return reslut; } demo1().then((val) => { console.log("demo1" + val) }); demo2().then((val) => { console.log("demo2" + val) }); demo3().then((val) => { console.log("demo3" + val) }); // 打印出: // e:处理失败! // demo1处理成功! // demo2处理失败! // demo3返回正常值
async 函数
async 函数是使用async
关键字声明的函数,并且其中允许使用await
关键字。async
和await
关键字让我们可以用一种更简洁的方式写出基于Promise
的异步行为,而无需刻意地链式调用promise
。说白了就是promise的另一种使用形式。
- async 函数一定会返回一个 promise 对象。如果一个 async 函数的返回值看起来不是 promise,那么它将会被隐式地包装在一个 promise 中。
async function demo(){ return 1; } async function demo1(){ return Promise.resolve(1); } demo().then((val)=>{ console.log('demo:'+val) }) demo1().then((val)=>{ console.log('demo1:'+val) }) // demo和demo1函数返回的数值一样 - 在async函数中可能会包含0到多个的await 表达式。以下打印的顺序是过两秒之后打印1再过两秒之后打印2之后是‘33333’。
async function foo() { const result1 = await new Promise((resolve) => setTimeout(() => resolve('1'), 2000)) console.log(result1) const result2 = await new Promise((resolve) => setTimeout(() => resolve('2'), 2000)) console.log(result2) console.log("33333") } foo()
使用 async 函数重写 promise 链
function demo1() { let r1 = new Promise((resolve) => { resolve(1) }).then((val) => { console.log('val1:' + val) return Promise.resolve(val + 1) }).then((val) => { console.log('val2:' + val) return Promise.resolve(val + 1) }) .catch((e) => { console.log(e) }) } async function demo2() { try { let val=1; let val1=await Promise.resolve(val); console.log('val1:' + val1) let val2=await Promise.resolve(val1+1); console.log('val2:' + va2) } catch (e) { console.log(e) } } demo1() demo2()
以上demo1和的demo2函数的执行过程是一样的。
async/await 和Promise#then 对比以及错误处理: 警告:
大多数 async 函数也可以使用 Promises 编写。但是,在错误处理方面,async 函数更容易捕获异常错误
上面例子中的 demo1
函数和demo2
函数在功能上都是等效的。在demo2
函数中,如果任一await
ed 调用失败,它将自动捕获异常,async 函数执行中断,并通过隐式返回 Promise 将错误传递给调用者。
在 Promise 例子中这种情况同样会发生,该函数必须负责返回一个捕获函数完成的Promise
。在demo1
函数中,这意味着它从Promise.all([]).then()
返回一个 Promise。
微信公公众号 搜索 “不正经小前端” 并关注,和我一起学习海量前端技术
本文来自博客园,作者:七分暖,转载请注明原文链接:https://www.cnblogs.com/lin494910940/p/16414501.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签