首页 > 其他分享 >await 到底在等什么?

await 到底在等什么?

时间:2024-03-25 14:11:07浏览次数:25  
标签:const log 到底 什么 await error test data

核心

其实 await 本质上等的是:后面的 thenable 对象的 then 方法调用 resolve 或者 reject。

这里面其实包含三个细节:

  1. thenable 对象其实就是包含 then 方法的普通对象。
  2. 如果 await 后面的对象不是一个 thenable 对象,那么系统会将它包装成 thenable 对象。
  3. Promise 对象具有 then 方法,所以 Promise 对象其实也是一个 thenable 对象。

如果理解了这三个细节,那么下面这些测试应该就很好理解了。

测试

测试一:普通 thenable 对象

const test = async () => {
    try {
        const data = await { then(resolve, reject) { resolve('hello') } }
        console.log(data, 'data')
    } catch (error) {
        console.log(error, 'error')
    }
}
test()
// hello data
const test = async () => {
    try {
        const data = await { then(resolve, reject) { reject('hello') } }
        console.log(data, 'data')
    } catch (error) {
        console.log(error, 'error')
    }
}
test()
// hello error
const test = async () => {
    await { then: r => setTimeout(r, 1000) }
    console.log('done')
}

test()
// 1s 之后输出 done

测试二:非 thenable 对象

const test = async () => {
    const data = await 'hello'
    console.log(data, 'data')
}

test()
// hello data
const test = async () => {
    const data = await { a: 1 }
    console.log(data, 'data')
}

test()
// { a: 1 } data

测试三:Promise 对象

const test = async () => {
    try {
        const data = await Promise.resolve('hello')
        console.log(data, 'data')
    } catch (error) {
        console.log(error, 'error')
    }
}
test()
// hello data
const test = async () => {
    try {
        const data = await Promise.reject('hello')
        console.log(data, 'data')
    } catch (error) {
        console.log(error, 'error')
    }
}
test()
// hello error

总结

总的来说,await 这个操作符,实际上会调用对象的 then 方法,并传入 resolve 和 reject 参数,等我们 then 方法中调用了 resolve 或者 reject 时 await 的结果就等到了。而对于没有 then 方法的对象或者变量,系统会自动生成一个具有 then 方法的对象(也就是Promise对象),然后将该对象或者变量作为 resolve 的参数进行调用返回。

其实我们平时一般会把 await 理解成等到后面 Promise 的返回结果,这样理解其实没有什么问题,而且覆盖我们平时编程的绝大多数场景。但是更精细一点的理解其实应该要理解到 await 本质上是在操作对象的 then 方法(调用对象的 then 方法,并传入 resolve、reject,并等待 then 方法去调用他们)。

标签:const,log,到底,什么,await,error,test,data
From: https://www.cnblogs.com/caihongmin/p/18094265

相关文章

  • 前端卷到了什么程度?
    部门缺人,前端后端测试岗:jinshuju.net/f/o38ijj前端开发领域的竞争和创新达到了前所未有的高度。从各种趋势和技术更新中可以看出,前端开发者面临着快速变化的技术环境和不断涌现的新技术、框架和库。例如,反TypeScript、Vue&&React、webpack&&vite、Turbopack、Rust、NestJS、......
  • 为什么使用类型化数组来进行字节操作而不是普通的 javascript 数字数组
    1.javascript中的数字数据类型默认为64位(8字节),无论任何数字。这意味着可以在不损失精度的情况下表示-2⁵³+1到2⁵³–1范围内的数字。这意味着即使我们想存储10个,也会消耗8个字节的内存,而这是根本不需要的。当内存效率是一个问题时,特别是在处理大型整数数组或二进制数......
  • 4 个多月的蓝猫吃什么猫粮发腮快?
    亲爱的猫友们,你们是不是也在为蓝猫的发腮问题而苦恼呢?......
  • 什么是慢SQL且如何查看慢SQL
    什么是慢SQL且如何查看慢SQL?介绍某个SQL执行时间超过指定时间时称为慢SQL。我们可以查看慢SQL,包括历史慢SQL以及当前慢SQL。查看历史慢SQL首先要设置log_min_duration_statement,记录慢SQL。然后在参数log_directory指定的目录中查看日志。进入数据库的数据目......
  • 为什么连接数据库的端口号与配置文件中的端口号不一致?
    为什么连接数据库的端口号与配置文件中的端口号不一致?背景介绍:在安装openGauss3.0数据库时,发现配置文件中写的端口号是5432,但是数据库连接时,执行gsql--dpostgres-p5432提示错误,无法连接到数据库。报错内容:[omm@hostname]$gsql-dpostgres-p5432failedtoconn......
  • 什么是coredump
    什么是coredump介绍在Linux开发中,我们经常听到程序员说我的程序core掉了,通常出现这类的问题是低级bug中的内存访问越界、使用空指针、堆栈溢出等情况。使程序运行过程中异常退出或者终止,满足这些条件就会产生core的文件。为什么会发生CoredumpCore是内存的意思,这个......
  • 为什么会出现段错误
    为什么会出现段错误?介绍一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考Answers.com):Asegmentationfault(oftenshorte......
  • 什么是栈溢出
    什么是栈溢出?介绍了解栈溢出,首先要了解什么是栈。栈是一种典型的先进后出(FirstinLastOut)的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作。进栈(PUSH):将一个数据放入栈里叫进栈(PUSH),相当于在扑克牌的在最上面放了一张新的扑克牌。出栈(POP):将一个数据从栈里取出叫......
  • Linux脚本首行中的#!是什么作用?为文件指定解释器
    起因今天和小伙伴日常在群内吹水的时候,有群友问了这样一个问题:脚本文件第一行加个#!/usr/bin/bash有什么用呢?其实,除了这种之外,还有很多其他写法,比如:#!/bin/bash#!/usr/bin/envbash#!/bin/awk这些写法大同小异,但很多同学像我一样,在之前编写shell脚本的时候顺手就抄过......
  • Drop 、Delete、Truncate的区别是什么
    Drop、Delete、Truncate的区别是什么?DROP删除表结构和数据,truncate和delete只删除数据truncate操作,表和索引所占用的空间会恢复到初始大小;delete操作不会减小表或索引所占用的空间;drop操作释放表或索引的占用空间。truncate和drop是DDL,操作立即生效,delete是DML,......