es6学习之async和await关键字

await关键字

await关键字只能在async函数中使用,如果再没有async的函数中使用就会报错。

  1. await关键字会暂停当前async函数的执行,等待promise处置完成。
  2. 如果promise正常处理则会返回promise中的resolve的值。
  3. 如果处理失败会把promise的异常原因抛出。
  4. 如果await操作符的表达
  5. +式不是一个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关键字。asyncawait关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。说白了就是promise的另一种使用形式。

  1. 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函数返回的数值一样
  2. 在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函数中,如果任一awaited 调用失败,它将自动捕获异常,async 函数执行中断,并通过隐式返回 Promise 将错误传递给调用者。

在 Promise 例子中这种情况同样会发生,该函数必须负责返回一个捕获函数完成的Promise。在demo1函数中,这意味着它从Promise.all([]).then()返回一个 Promise。

 

posted @   七分暖  阅读(184)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签
感觉不错来个赞@_@
回到顶部
点击右上角即可分享
微信分享提示