js---async和awit的一些理解

一、async函数的执行(async关键字意思表示为异步

async函数体里没有搭配await关键字使用时,async函数的执行和普通函数一致

    async function fn1() {
      console.log("我是async异步函数");
    }

    function fn2() {
      console.log("我是普通函数");
    }
    fn1()
    fn2()

 控制台执行:

 async函数体里搭配await关键字使用时,async函数体执行遇到await关键字时,await会阻塞async函数体继续往下执行,await往下的代码会被进入异步任务队列等待主线程执行完毕后再执行

案例1:

 控制台执行:

案例2:

控制台执行:

 二、async函数的返回值

 async函数的返回值全为Promise对象:

 1、当函数体内返回Promise对象时,那么async函数的返回值跟函数体内返回Promise对象保持一致

①promise对象为等待状态

    async function fn() {
      return new Promise((reslove, rejiect) => {
        //不调用reslove或者reslove函数,那么promise会一直为等待状态
      })
    }

    let result = fn()
    console.log(result);

执行:

②promise对象为失败状态

    async function fn() {
      return new Promise((reslove, reject) => {
        setTimeout(() => {
          //模拟异步请求后端数据,超过了3秒后请求超时
          reject("请求超时")
        }, 3000)
      })
    }

    let result = fn()
    console.log(result);

执行:

③promise对象为成功状态

    async function fn() {
      return new Promise((reslove, rejiect) => {
        setTimeout(() => {
          //模拟异步请求后端数据,1秒钟后端数据返回
          reslove('后端数据')
        }, 1000)
      })
    }

    let result = fn()
    console.log(result);

执行:

 2、当函数体内返回不是Promise对象时,那么async函数会调用Promise.reslove()封装函数体的返回,保证async函数返回为promise对象

①函数无返回值时默认返回undefined

    async function fn() {

    }

    let result = fn()
    console.log(result);

执行:

② 函数返回值为普通数据(字符串,数值,布尔值,对象...)

    async function fn() {
      return 1
      // return '哈哈哈'
      // return true
      // return [1, 2, 3]
      // return { name: 'hsq' }
      // return function () {
      //   console.log("hsq");
      // }
    }

    let result = fn()
    console.log(result);

执行:

 三、await运算符的搭配

注意:await运算符一定要在async函数里使用,一般我们使用await + promise对象搭配使用,获取promise对象为成功的结果值

1、await其实就是一个运算符,获取运算成功的值,await后面搭配表达式,

①await 表达式(非promise对象

案例:

    async function fn() {
      // let result = await 1
      // let result = await 1 + 1
      // let result = await 'hsq'
      // let result = await function () {
      //   console.log('函数');
      // }
      // let result = await [1, 2, 3]
      let result = await {
        name: 'hsq'
      }

      console.log(result);
    }
    fn()

执行:

② await 表达式(promise对象

await + promise对象运行结果返回promise对象状态为成功的的结果值

案例:

②peomise对象为等待

    async function fn() {
      let result = await new Promise((reslove, reject) => {

      })

      console.log(result);

    }
    fn()

执行:

ps: promise对象为等待时,await + promise对象运行结果无法获取结果

②peomise对象为失败

    async function fn() {
      let result = await new Promise((reslove, reject) => {
        setTimeout(() => {
          reject("失败")
        }, 1000)
      })
      // .catch(res => {
      //   console.log(res);
      // })
      console.log(result);

    }
    fn()

执行:

ps:当promise对象为失败时,线程会抛出异常, await + promise对象运行结果无法返回promise对象状态为失败的的结果值,可以通过promise的.catch()方法获取promise失败的结果值

③peomise对象为成功

    async function fn() {
      let result = await new Promise((reslove, reject) => {
        setTimeout(() => {
          reslove("成功获取的数据")
        }, 1000)
      })

      console.log(result);
    }
    fn()

执行:

 ③别忘了async函数的返回值为promise对象,可以搭配await使用

案例:

    async function getData() {
      return new Promise((reslove, reject) => {
        setTimeout(() => { reslove("成功获取后端返回数据") }, 1000)
      })
    }

    async function useData() {
      let result = await getData()
      console.log(result);
    }
    useData()

执行:

四、总结

 1、async表示异步,async函数执行时遇到await只会阻塞自己函数体内代码的执行,不会阻塞主线程代码的执行,所以称为异步函数

2、await只能存在在async异步函数中,我们一般使用async+await+promise进行异步编程,await+promise只能获取promise对象为成功时的结果值,promise对象为失败时的结果值只能通过捕获异常的方式获取。

五、补充

async函数里遇到await之前的代码是同步里的,遇到await时,会把await下面的代码放入微任务队列,并且退出这个async函数,当主线程空闲时再执行微任务队列的代码

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在C#中,async和await是用于异步编程的关键字,可以让开发者更方便地进行异步编程。下面是async和await的详细使用方法: 1. 异步方法的定义 在定义异步方法时,需要在方法前面加上async关键字。异步方法的返回值类型必须是Task或Task<TResult>。 ```csharp public async Task<int> DoAsync() { //执行异步操作 return 1; } ``` 这里定义了一个异步方法DoAsync,该方法返回一个Task<int>对象,包含异步操作的返回值。 2. 异步方法的调用 在调用异步方法时,需要在方法前面加上await关键字。await会等待异步方法执行完成,并获取其返回值。 ```csharp int result = await DoAsync(); ``` 这里调用DoAsync方法,并使用await关键字等待其执行完成,并获取其返回值。 3. 异步方法中的异常处理 在异步方法中可能会发生异常,需要使用try/catch语句来捕获异常。异步方法中的异常可以使用throw语句抛出,也可以使用Task.FromException方法创建一个Task对象来表示异常。 ```csharp public async Task<int> DoAsync() { try { //执行异步操作 return 1; } catch(Exception ex) { //处理异常 throw ex; } } ``` 4. 异步方法中的延续操作 在异步方法中可以使用await关键字来等待另一个异步方法执行完成,并在其执行完成后执行一些操作。 ```csharp public async Task<int> DoAsync() { int result = await Task.Run(() => { //执行异步操作 return 1; }); //处理异步操作执行结果 return result; } ``` 这里在异步方法中调用Task.Run方法执行另一个异步操作,使用await关键字等待其执行完成,并获取其返回值。 5. Task的等待 在异步方法中,可以使用Task的Wait方法等待异步操作执行完成。需要注意的是,使用Wait方法会阻塞当前线程,因此需要在后台线程中执行异步操作。 ```csharp public async Task<int> DoAsync() { Task<int> task = Task.Run(() => { //执行异步操作 return 1; }); task.Wait(); //处理异步操作执行结果 return task.Result; } ``` 这里使用Task.Wait方法等待异步操作执行完成,并使用Task.Result属性获取异步操作的返回值。 以上就是async和await的一些常用使用方法,利用async和await可以更方便地进行异步编程。需要注意的是,在使用async和await时需要注意线程安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cirrod

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

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

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

打赏作者

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

抵扣说明:

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

余额充值