async await用法

async代表后面的函数中有异步操作(声明一个异步函数只需要在普通函数前面加一个关键字async),await表示等待一个异步方法执行完成。

async函数返回的是一个Promise对象(如果返回值不是Promise对象,也返回一个Promise,只不过立即resolve)。

因此async函数通过return返回值会成为then方法中回调函数的参数:

async function funA() {
  return 'hello';
}
funA().then(value => {
  console.log(value);
})
//hello

单独写一个async函数与Promise函数执行功能是一样的。

await是异步等待,等待的是一个Promise,因此await后面应该写一个Promise对象,如果不是Promise对象,那么会被转成一个立即resolve的Promise。

 

async函数被调用后立即执行遇到await就会先返回,异步操作执行完成后接着执行函数体内后面的语句,示例:

async function func(){
console.log('async function is running!');
const num1=await 200;
console.log(`num is ${num1}`);
const num2=await num1+100;
console.log(`num2 is ${num2}`);
const num3=await num2+100;
console.log(`num3 is ${num3}`)
}
func();
console.log('run me before await');
// async function is running!
// run me before await!
// num1 is 200
// num2 is 300
// num3 is 400

解析:调用async func函数后,func会立即执行,首先输出‘async function is running!’

遇到await异步等待,函数返回,先执行func()后面的同步任务

同步任务执行完之后,接着await等待的位置继续往下执行

async函数可以看做多个异步操作,包装成一个Promise对象,await命令就是内部then命令的语法糖

注:await后面的Promise对象不总是返回resolved状态,只要一个await后面的Promise状态变为rejected,真个async函数都会被中断执行。

 

为了保存错误位置和错误信息,我们需要try...catch语句来封装多个await过程:

在 num2 处 await 得到了一个状态为 rejected 的Promise对象,该错误会被传递到 catch 语句中,这样我们就可以定位错误发生的位置。

示例:

async function func() {
  try {
    const num1 = await 200;
    console.log(`num1 is ${num1}`);
    const num2 = await Promise.reject('num2 is wrong!');
    console.log(`num2 is ${num2}`);
    const num3 = await num2 + 100;
    console.log(`num3 is ${num3}`);
  } catch (error) {
    console.log(error);
  }
}
func();
// num1 is 200
// 出错了
// num2 is wrong!

 

async/await强于Promise的地方:优化then的链式调用。

function sayHi(name){
  return new Promise((resolved,rejected)=>{
    setTimeout(()=>{
      resolved(name)
    },2000)
  })
}
async function sayHi_async(name){
const sayHi_1=await sayHi(name)
console.log(`你好,$(sayHi_1)`)
const sayHi_2=await sayHi('李四')
console.log(`你好,$(sayHi_2)`)
const sayHi_3=await sayHi(‘王五’)
console.log(`你好,$(sayHi_3)`)
}
sayHi_async('张三')
// 你好, 张三
// 你好, 李四
// 你好, 王二麻子

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值