async await 异步处理

ES2017标准引入async函数,它是Generator函数的语法糖,await命令后接Promise对象。async函数返回的Promise对象需内部异步操作完成才改变状态。它有多种使用形式,若await后Promise对象reject,函数会中断,可通过try…catch避免,无继发关系的异步操作可同时触发。

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

ES2017 标准引入了 async 函数,使得异步操作变得更加方便。
async 函数是什么?一句话,它就是 Generator 函数的语法糖。
await 命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,
除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

   function ajax(){
    return new Promise((resolve,reject)=>{
      setTimeout(()=>{
      resolve('xiaoji')
    },2000)
    })
  }

  async function getName(){
    let name = await  ajax()
    return name
  }

  getName().then(res=>{
    console.log(res)
  }).catch(err=>{
    console.log(err)
  })

async 函数有多种使用形式。

  // 函数声明
  async function foo() {}

  // 函数表达式
  const foo = async function () {};

  // 对象的方法
  let obj = { async foo() {} };
  obj.foo().then(...)

  // Class 的方法
  class Storage {
    constructor() {
      ...
    }
    async getAvatar(name) {...}
  }
  const storage = new Storage();
  storage.getAvatar('jake').then();

  // 箭头函数
  const foo = async () => {};

任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try…catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。

async function f() {
    try {
      await Promise.reject('出错了');
    } catch(e) {
      console.log(e)
    }
    return await Promise.resolve('hello world');
  }

  f().then(v => console.log(v))// hello world


  async function f() {
    await Promise.reject('出错了').catch(e => console.log(e));
    return await Promise.resolve('hello world');
  }

  f().then(v => console.log(v))  // 出错了 // hello world

多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值