async与await.md

本文介绍了async函数的基础概念及其实现方式,包括如何通过async关键字定义异步函数,以及如何利用await表达式同步地等待Promise对象的解析结果。同时探讨了async函数返回的Promise对象及其结果,并展示了如何处理异步函数中的错误。

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

基本定义

async 函数

async function 用来定义一个返回 AsyncFunction对象的异步函数,异步函数是指通过事件循环异步执行的函数,它会通过一个隐式的Promise返回结果

  • 函数的返回值为 Promise 对象
  • promise 的结果由 async 函数执行的返回值决定

await 表达式

await 操作符用于等待一个 Promise 对象,它总能在异步函数 async function 中使用

  • await 右侧的表达式一般为 promise 对象,但也可以是其他的值
  • 如果表达式是 promise 对象,await 返回的就是 promise 成功的值

test

  • 普通函数
	function fn() {
	  return 1;
	}
	const result = fn();
	console.log(result);     
	
	// 1
  • 加 async
    async function fn() {
      return 1;
    }
    const result = fn();
    console.log(result);

通过打印出来的结果可以知道
async 函数的返回结果是一个promise类型的对象👆👆

除了成功的返回结果之外也可以功过 throw 来抛出:

    async function fn() {
      // return 1;
      throw 2;
    }
    const result = fn();
    console.log(result);

也可以写成这样

    async function fn() {
      // return 1;
      throw 2;
    }
    const result = fn();
    // console.log(result);
    result.then(
      value => {
        console.log("onResolved(): ", value);
      },
      reason => {
        console.log("onRejected(): ", reason);
      }
    )
    async function fn() {
      // return 1;
      // throw 2;
      return Promise.resolve(3);     //返回一个成功的 promise
      // return Promise.reject(3);     //返回一个失败的 promise
    }
    const result = fn();
    // console.log(result);
    result.then(
      value => {
        console.log("onResolved(): ", value);
      },
      reason => {
        console.log("onRejected(): ", reason);
      }
    )

可以看到这样返回的结果和之前 return 直接返回的是一样的

async 函数返回的promise 的结果由函数执行的结果决定

当然这里也可以返回带有延迟的函数

    async function fn() {
      // return 1;
      // throw 2;
      // return Promise.resolve(3);     //返回一个成功的 promise
      // return Promise.reject(3);     //返回一个失败的 promise

      // 也可以返回一个延迟成功/失败的
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(4);
        }, 1000);
        console.log("waiting 1s...")
      })
    }
    const result = fn();
    // console.log(result);
    result.then(
      
      value => {
        console.log("onResolved(): ", value);
      },
      reason => {
        console.log("onRejected(): ", reason);
      }
    )

这里是先打印了 waiting 1s… ,1秒钟之后出来的下面的结果

  • await

先定义两个函数

function fn2() {
   return Promise.resolve(2);
}

function fn3() {
  const result2 = fn2();
}

这里要想拿到fn2()函数的值2,之前的写法是需要通过 .then() 然后获取到它的 value

下面用await来试试

    function fn2() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(5);
        }, 1000);
        console.log("waiting 1s...")
      })
    }

    function fn3() {
      return 6;
    }

    async function fn4() {
      // 这里的await 的意思就是等到 fn2() 执行完有结果的时候
      // await右侧表达式为promise,得到的结果就是promise成功的value
      const value = await fn2();
      // await右侧表达式不是promise,得到的结果就是右侧表达式结果
      const value2 = await fn3();

      console.log(value, "value");
      console.log(value2, "value2")
    }

    fn4()

规定只要用了 await 之后就必须使用 async ,不然会报错

await 只能得到成功的结果,如果想得到失败的结果,就必须进行 try…catch…

    function fn5(){
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject(5);
        }, 1000);
        console.log("waiting 1s...")
      })
    }

    async function fn4() {
      // 这里的await 的意思就是等到 fn2() 执行完有结果的时候
      // await右侧表达式为promise,得到的结果就是promise成功的value
      // const value = await fn2();
      // await右侧表达式不是promise,得到的结果就是右侧表达式结果
      // const value2 = await fn3();
      
      // 得到失败的结果
      try {
        const value3 = await fn5();
        console.log("value3", value3);
      } catch (error) {
        console.log("失败的结果: ", error);
      }
      // console.log(value, "value");
      // console.log(value2, "value2")
    }
    fn4()

⚠️⚠️⚠️

      // 如果fn1()函数不返回promise,而是直接返回一个 1
      // 那么在fn7()里面的fn6()就不是单纯的1,而是一个promise
      // (因为fn6()左侧是定义有async,所以调用的fn6()是一个异步函数,异步函数执行的结果是一个promise)
      // 但是在fn6()前面加了一个await,所以 await fn6() 的结果就还是 1 了(我得到的value的结果是1并不是因为fn6()返回的结果是1,而是因为fn6()返回的promise成功了,而且成功的结果是1)
    async function fn6(){
      return 1;
    }

    async function fn7(){
      const value = await fn6();
      console.log("value6: ", value);
    }
  • await必须写在async函数中,但async函数中可以没有await
  • 如果await的promise结果失败了,就会抛出异常,就需要try…catch…来进行异常处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值