node异步用await和不用await的区别

最近在用node写项目。新版node异步用的是async/await这两个关键字。我们都知道,一般这两个关键字要成对出现。但是,笔者发现,如果不需要等待返回值的话,await可以不加。那么await加和不加有什么区别呢?百度以及google了大量资料,结合评论,最终在实践中弄明白了。下面直接上例子。

不加await

async test(ctx,next){
    this.doThing().then(console.log('done Thing'))
    this.doAnotherThing();
    console.log('this way');
  }

  async doThing() {
    this.doA();
    this.doB();
  }
  
  doAnotherThing() {
    console.log('do another thing')
  }
  
  async doA() {
    return new Promise(resove => {
      setTimeout(() => {
        console.log('done A')
        resove()
      }, 1000)
    })
  }
  
  async doB() {
    return new Promise(resove => {
      setTimeout(() => {
        console.log('done B')
        resove()
      }, 100)
    })
  }

运行test函数以后,命令行迅速依次打印了如下结果
这里写图片描述
我们看到,没有加await,异步函数A,B顺序执行,由于A运行时间较长,所以B先执行完成,整个过程没有阻塞。

加await

async test(ctx,next){
    this.doThing().then(console.log('done Thing'))
    this.doAnotherThing();
    console.log('this way');
  }

  async doThing() {
    await this.doA()
    await this.doB()
  }
  
  doAnotherThing() {
    console.log('do another thing')
  }
  
  async doA() {
    return new Promise(resove => {
      setTimeout(() => {
        console.log('done A')
        resove()
      }, 1000)
    })
  }
  
  async doB() {
    return new Promise(resove => {
      setTimeout(() => {
        console.log('done B')
        resove()
      }, 100)
    })
  }

运行结果如下 :
这里写图片描述
由于加了await,所以要等待异步事件A先完成,然后才会进行事件B。也就是await不会阻塞同步事件的运行,但是异步却是一个一个执行的,其中一个阻塞,下一个异步事件就无法继续。

总结

可见,await也并不是每次都要使用。如果不需要返回值的话,在执行的时候,不加await能够加快函数的运行。
(以上为个人观点,如果错误或者不足,请大家批评指正)

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值