async、await的使用和解析

这里写目录标题

async

我们在编写代码时,有时候可能会编写异步函数,在拿到函数执行结果后,对结果进行处理,在ES6中,我们通常会用Promise来处理这些异步函数,把运行拿到的结果放进resolve里面,然后在then中进行成功时的回调。而在ES7中,允许我们使用async关键字来将一个函数转化为异步函数。让我们一起来看看async的用法吧!
我们需要在函数前面加上async,使之变成异步函数,比如:

async function foo1() {

}

const foo2 = async () => {

}

class Foo {
  async bar() {

  }
}

如果在async函数里面没有用await时,这个async函数的执行顺序和普通函数的执行顺序是一致的。
返回值:
async函数的返回值一定是一个Promise,如果在函数内部未返回任何值,那么相当于返回undefined,那么相当于整个函数返回的结果是Promise.resolve(undefined)。当返回值是一个数的时候,相当于返回的是Promise.resolve(这个数)。另外,异步函数中的异常, 会被作为异步函数返回的Promise的reject值的
比如:

async function foo() {
    throw new Error("error message")
}
foo().then(res => {
    console.log(res);
}).catch(err => {
    console.log(err);//error message
})

await

await关键字一般是在async函数里面结合使用的
await关键字有什么特点呢?

  • 通常使用await是后面会跟上一个表达式,这个表达式会返回一个Promise;那么await会等到Promise的状态变成fulfilled状态,之后继续执行异步函数;
  • 如果await后面是一个普通的值,那么会直接返回这个值;
  • 如果await后面是一个thenable的对象,那么会根据对象的then方法调用来决定后续的值;
  • 如果await后面的表达式,返回的Promise是reject的状态,那么会将这个reject结果直接作为函数的Promise的reject值
// 1.await跟上表达式
function requestData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve(222)
            reject(1111)
        }, 2000);
    })
}

async function foo() {
    const res1 = await requestData()
    console.log("后面的代码1", res1)
    console.log("后面的代码2")
    console.log("后面的代码3")

    const res2 = await requestData()
    console.log("res2后面的代码", res2)
}

// 2.跟上其他的值
// async function foo() {
//   // const res1 = await 123
//   // const res1 = await {
//   //   then: function(resolve, reject) {
//   //     resolve("abc")
//   //   }
//   // }
//   const res1 = await new Promise((resolve) => {
//     resolve("why")
//   })
//   console.log("res1:", res1)
// }

// 3.reject值
// async function foo() {
//   const res1 = await requestData()
//   console.log("res1:", res1)
// }

foo().catch(err => {
    console.log("err:", err) //err:1111
})
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

既白biu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值