问答

async/await为什么是异步操作呢?

作者:admin 2021-04-20 我要评论

同步不应该是执行这一段才往下执行 await是等待的意思,等待后面执行完成再执行下一段 那这不应该是同步么?我看很多技术文章都说async/await是异步操作 why~~...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

同步不应该是执行这一段才往下执行
await是等待的意思,等待后面执行完成再执行下一段
那这不应该是同步么?我看很多技术文章都说async/await是异步操作
why~~有点不理解

###
  const asyncFunc = async () => {
    await 1
    console.log(1)
  }
  console.log(asyncFunc())
  console.log(2)

打印顺序会是 Promise<>21,这说明只有 console.log(1) 会因等待 await 1而延期,外面的console.log(2)则是直接执行的,如果是同步的话理应先 1 后 2。
奥秘就在 asyncFunc 自动返回的这个 Promise 里:被迫“延期执行”的代码其实被装进了这个 Promiseresolver 里了,而Promiseresolver会被添加到微任务队列……

###

只是在当前async函数体内,将异步操做模拟成了同步操做,并不影响与它并行的代码的执行。实际上await还是一个回调函数语法糖

//  => 马上执行
// => 我两秒后执行了
;(async function () {
  await sleep(2000)
  console.log('我两秒后执行了')
})()
console.log('马上执行')

function sleep (milliSecond) {
  return new Promise(resolve => setTimeout(resolve, milliSecond))
}
###
async函数一定会返回一个promise对象。如果一个async函数的返回值看起来不是promise,那么它将会被隐式地包装在一个promise中。

async/await 其实就是把 await之后的函数变成了一个 promise,只不过是把 promise 的链式调用写法改成了看起来像同步的写法,就不需要每次都 .then 一直点下去了,增加可读性。

其实就是 Generator + Promise 的语法糖。

###

来看:理解 JavaScript 的 async/await

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器