记一次误用顶层await导致的路由渲染错误

news2024/11/24 19:25:10

背景:顶层 await

Async 异步函数能将 Promise 的链式调用的形式,改为同步的形式,对于编写和阅读代码都非常友好。但一直以来都有一个限制,就是 async 和 await 这两个关键字必须成对出现。这就导致了一个问题,想使用 await,必须要将其定义在一个 async 函数中,再调用此函数。所以 ECMAScript 中一直有一个提案,叫做顶层 await,它 支持在 async 函数以外使用 await,但是只能在一个模块的顶层中使用。这个提案于2022年正式成为 ES 标准语法。

过去的写法是这样的:

async function fn() {
  const value = await 10; // await 不仅可以接Promise,也可以将普通值
  console.log(value)
}

main();

使用顶层await 之后,就可以这样写了:

const value = await 10;
console.log(value)

但是一定有一个前提,必须处于模块的顶层。我就是没有注意这一点,导致出现了一个问题。

bug 出现

有一次开发时突发奇想,想用一下这个顶层await。于是写下了类似下面的代码:

<script setup>

const res = await axios(url)

</script>

然后过了一会,等去调试页面时才发现已经白屏了。于是打开调试工具,在元素面板中看到了整个页面的路由都没有渲染出来,只剩下一个空注释节点了:

image.png

在控制台中看到了如下警告:

[Vue warn]: Component <Anonymous>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.

起初按照直觉,以为是路由表配置出了问题,导致路由渲染不出来,反复调试路由配置,始终不奏效。然后搜索这条警告信息,果然有不少朋友都遇到过,无一例外是在 <script setup> 中使用了顶层 await。那我就纳闷了,说好的顶层await怎么不好用了呢?

盯着代码想了一会,突然想起 <script setup> 只是语法糖啊!那么上面的代码就相当于在 setup 方法中使用了 await:

<script>
export default {
  setup() {
      const res = await axios(url)
  }
}
</script>

这自然不是在模块顶层中使用了,也就导致了在解析上出现问题,导致组件不能正确渲染,最终导致对应的路由视图没有渲染出来。

小结

起初由于空页面,空节点,误解是路由的问题。其实 <router-view> 之所以被渲染成注释节点,看似是路由组件没有正确渲染,也有可能是组件本身出了问题。另外,在使用一些新特性要特别注意使用条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaScript速成之路】一文带你掌握DOM基础

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录 前言1&#xff0c;Web API简介1.1&#xff0c;初识Web API1.2&#xff0c;Web A…

TryHackMe-Services(Windows域渗透)

Services 认识团队&#xff01; 今天thm新出的房间&#xff0c;尝尝鲜 端口扫描 循例nmap 把services.local加入hosts Web枚举 发现员工邮箱以及一些员工姓名 从下边的邮箱中&#xff0c;大致可以猜测其他员工账户名跟这个一致的格式 将其保存起来 立足 - AS-REP Roasting…

gin获取url路径参数

package mainimport ("github.com/gin-gonic/gin""net/http" )//获取请求路径的path参数 func main() {r : gin.Default()r.GET("/user/:name/:age", func(c *gin.Context) {//获取路径参数name : c.Param("name")age : c.Param("…

华为云上云实践(一):Windows 环境下对云硬盘 EVS 的创建、挂载和初始化

本文主要讲解华为云云硬盘 EVS 的在 Windows 服务器上创建、挂载及云硬盘初始化等基本操作&#xff0c;快速掌握华为云云硬盘 EVS 操作方法。 文章目录 一、前言二、前期准备&#xff1a;华为云 EVS 采购三、挂载非共享云硬盘 EVS五、初始化云硬盘 EVS 一、前言 华为云 EVS&am…

除了Navicat和DBeaver,还有没有免费又好用的数据库管理工具推荐

最近看到一款数据库Web版工具&#xff0c;SQL Studio&#xff0c;是麦聪软件公司出品的&#xff0c;主打的就是一个&#xff0c;不使用任何的开源代码&#xff0c;产品由中国研发团队100%自主研发。 SQL Studio是一款可创建多个连接的Web版数据库管理开发工具&#xff0c;让你…

RocketMQ的学习历程(二)----MQ基本构架

文章目录 1.MQ的基本要素1.1.消息&#xff08;Message&#xff09;1.2.主题&#xff08;Topic&#xff09;1.3.标签&#xff08;Tag&#xff09;1.4.队列&#xff08;MessageQueue&#xff09;1.5.消息标识&#xff08;MessageId&#xff09; 2.MQ中的主要角色和相关联系2.1.Pr…

列表、栈、队列

列表&#xff08;List&#xff09; 介绍 一系列有序元素的集合。列表中的元素可以是任意类型&#xff0c;允许重复。 可通过索引定位、访问列表中的&#xff08;单个&#xff09;元素&#xff0c;还可使用切片&#xff08;slice&#xff09;操作一次性访问多个元素&#xff…

LINUX系统SSH连接安装Matlab、添加环境变量、后台运行Matlab脚本

安装Matlab 使用MobaXterm软件SSH连接远程服务器&#xff0c;输入IP、用户名和端口号&#xff1a; 输入密码进入&#xff08;密码不显示&#xff09; 网上找一个Matlab安装包&#xff08;iso镜像&#xff09;上传进服务器端&#xff0c;或者直接使用wget指令在服务器端下载镜…

Faster RCNN系列4——生成Proposal与RoI

Faster RCNN系列&#xff1a; Faster RCNN系列1——Anchor生成过程 Faster RCNN系列2——RPN的真值与预测值概述 Faster RCNN系列3——RPN的真值详解与损失值计算 Faster RCNN系列4——生成Proposal与RoI Faster RCNN系列5——RoI Pooling与全连接层 一、生成Proposal 生成Pr…

【python中的多进程了解一下?】

基本说明 多进程是指在同一台计算机中同时运行多个独立的进程。每个进程都有自己的地址空间&#xff0c;可用于执行一些特定的任务。这些进程可以同时执行&#xff0c;从而提高了程序的性能和效率。多进程可以在多核计算机上实现真正的并行计算&#xff0c;可以同时运行多个程…

资本观望,大厂入局,海外大模型血脉压制……国内AIGC创业者的机会在哪里?...

图片来源&#xff1a;由无界 AI生成 A股AI概念股直线式拉涨&#xff0c;技术大牛带资进组分分钟成数十亿人民币独角兽&#xff0c;互联网巨头争抢着入局&#xff0c;政府各类扶持政策持续出台&#xff0c;媒体动不动就是万亿风口&#xff0c;500万年薪难招AIGC大牛……2022年以…

57、Yolov8-seg实例分割部署MNN、OpenVINO、OAK,RK3588平台上

基本思想&#xff1a;部署yolov8-seg到mnn、openvino、oak平台上&#xff0c;仅仅做记录 实验模型&#xff1a;链接: https://pan.baidu.com/s/1ilX1YMuhONkisKuGuiqvWw?pwd75ti 提取码: 75ti 一、是用官方模型转onnx首先&#xff0c;然后进行sim一下,是用模型日期2023-04-2…

从120s到2.5s,看看人家的MyBatis批量插入数据优化,那叫一个优雅

最近在压测一批接口&#xff0c;发现接口处理速度慢的有点超出预期&#xff0c;感觉很奇怪&#xff0c;后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus&#xff0c;批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我点进去看了下源码&#xff0c…

入职华为外包一个月后,我离职向“北上广深”流浪了...

这次来聊一个大家可能也比较关心的问题&#xff0c;那就是就业城市选择的问题。而谈到这个问题&#xff0c;就不可避免地会谈到一些关于&#xff1a;机会&#xff1f;技术氛围&#xff1f;跳槽&#xff1f;薪资水平&#xff1f;等等一系列问题。 正好&#xff0c;这也是大家所…

【react全家桶】react-router

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 11 【react-router】1.准备1.1 SPA1.2 …

搞懂分布式RPC开源框架-gRPC

搞懂分布式RPC开源框架-gRPC rpc解决了什么问题&#xff0c;与消息队列应用场景比较 rpc(远程调用方法):请求回应 socket网络问题 ------> 消除端到端交互问题 业务场景&#xff1a; rpc&#xff1a;同步地处理 消息队列&#xff1a;不紧迫的非必要的 异步解决问题 &#x…

【回眸】又是一年毕业季,怎么利用ChatGPT 4.0 优化毕业论文?

目录 【回眸】又是一年毕业季&#xff0c;怎么利用ChatGPT 4.0 优化毕业论文&#xff1f; 前言 ChatGPT4.0降重提示词&#xff08;3.5表现略逊色一些&#xff0c;不过也可以用这个来作为提示词&#xff09; 举个例子 降重前的原文 构思提示词 确定提问词 选用合适的翻译…

CloudCompare如何进行二次开发?

文章目录 0.引言1.界面设计2.功能实现3.结果展示 0.引言 CloudCompare源代码编译成功后&#xff0c;即可进行二次开发&#xff0c;可以通过修改源码或者制作插件&#xff08;插件开发详见&#xff1a;CloudCompare如何进行二次开发之插件开发&#xff1f;&#xff09;实现二次开…

SpringBoot配置文件(properties与yml详解)

目录 一&#xff0c;SpringBoot配置文件 1&#xff0c;配置文件的作用 2&#xff0c;配置文件的格式 二&#xff0c;properties 配置文件说明 1&#xff0c;properties 基本语法 2&#xff0c;读取配置文件 3&#xff0c;properties 的缺点 三&#xff0c;yml配置文件说…

掌握Linux指令和权限:一个入门教程

目录 一.Linux基本指令1.ls指令2.pwd指令3.cd指令4.touch指令5.mkair指令6.rmdir和rm指令 一.Linux基本指令 1.ls指令 语法格式:ls [选项][目录或者文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其…