• async await


    Async基本用法

    async就是Generator函数的语法糖。将一个函数加上async就表示这是一个异步函数,返回的结果是一个Promise。

    1. async function run() {
    2. return 'hello world'
    3. }
    4. run().then((res) => {
    5. console.log(res); // hello world
    6. })

    函数内部抛出的错误会被catch方法捕获

    1. async function run() {
    2. throw Error('error')
    3. }
    4. run().catch((err) => {
    5. console.log(err); // Error: error
    6. })

    Async特点一

    async函数执行的时候,遇到await就会执行await后面的代码,一般后面是一个Promise,会等到这个异步的状态改变才会继续执行函数后续的代码

    1. async function run() {
    2. console.log(new Date().getTime());
    3. let res = await timeout(2000, 'hello word')
    4. console.log(new Date().getTime());
    5. return res
    6. }
    7. function timeout(tiem, val) {
    8. return new Promise((resolve, reject) => {
    9. setTimeout(() => {
    10. resolve(val)
    11. }, tiem)
    12. })
    13. }
    14. run().then((res) => {
    15. console.log(res); // Error: error
    16. })
    17. /*
    18. * 1697713077175
    19. * 1697713079187 两秒之后状态改变执行
    20. * hello word
    21. */

     Async特点二

    async返回的异步结果,需要等到函数内所有await后面的异步状态改变完毕,返回。

    1. async function run() {
    2. let res = await timeout(2000, 'hello word')
    3. let res2 = await timeout(4000, '2023')
    4. return res + res2
    5. }
    6. function timeout(tiem, val) {
    7. return new Promise((resolve, reject) => {
    8. setTimeout(() => {
    9. resolve(val)
    10. }, tiem)
    11. })
    12. }
    13. run().then((res) => {
    14. console.log(res); // hello word2023
    15. })

     Async特点三

    async函数内任何一个Promise状态改变为reject都会阻断函数的执行

    1. async function run() {
    2. await Promise.reject('error')
    3. return await Promise.resolve('success') // 不会执行
    4. }
    5. run().catch((res) => {
    6. console.log(res); // error
    7. })

    引用阮一峰老师的错误处理方式

     Async特点四

    await只能出现再async函数内

    1. function run() {
    2. await Promise.resolve('success') Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
    3. }

    Async应用:异步循环

    1. async function run() {
    2. for (let i = 0; i <= 3; i++) {
    3. await timeout(1000, i) // await 阻断函数后续代码的执行,等待Promise状态并返回结果。不会将Promise加入到微任务
    4. console.log(i); // 每隔一秒后输出
    5. }
    6. console.log("执行后续代码"); // 4秒后输出
    7. }
    8. run()
    9. function timeout(tiem, val) {
    10. return new Promise((resolve, reject) => {
    11. setTimeout(() => {
    12. resolve(val)
    13. }, tiem)
    14. })
    15. }

    Await是不是一个微任务

    在async函数中await关键字是用于等待一个Promise的状态。当async函数中遇到await会暂函数的执行,等待Promise的状态并返回结果。

    当await一个Promise时并不会把Promise加入到微任务,而是等待Promise的状态,一旦得到Promise的状态就会返回结果,继续执行后续的代码。

    总结起来await不是一个微任务,而是等待Promise状态的关键字。

  • 相关阅读:
    BigDecimal在生产上怎么用?
    时代和人民的精神脉动
    【GlobalMapper精品教程】032:浏览地理照片及航线信息(航测应用)
    攻防世界-filemanager
    列表、元组和字典
    走访名校名企,助力生涯规划
    Linux下安装docker以及docker安装Oracle19c的全部详细过程及各种问题解决
    Vue3的props需要注意的地方(简写与监视属性)
    AD教程系列 | 5 - 绘制原理图
    .npmrc 使用详解
  • 原文地址:https://blog.csdn.net/HeyOldThiefSima/article/details/133932394