uni-app原生api的promise化以解决异步等待问题分析

相信各位在进行uni-app开发的时候会遇到各种关于异步回调问题,例如要传code给后端以换取session_key,在这之前需要先调用 uni.login,所以执行的顺序是必须同步等待的。在写这篇文章之前对于整体的流程概念需要做一个梳理,以便能更好的认识其中的逻辑,整体篇幅会较长,因为并非专攻前端领域,相当于给自己做一个整理。


1.同步

首先我们在初始化的onLoad中添加如下打印,会发现 控制台会按顺序打印11122233
在这里插入图片描述

结果如下

在这里插入图片描述
在此需要注意的是onload中的两个方法是同步执行的,打印的结果可以发现并没有影响控制台的内容顺序变化



2.异步

但如果你在两个方法中再加上打印你会发现,他们的执行顺序并不是同步的而是异步的。在此我们需要清楚 JS 是以单线程的方式运行,也就是一次只能完成一个任务,但是为何在以下举例图片中,获取底部图片会先执行呢。这是因为在两个方法中都是一个封装的异步的request的请求,返回了一个 promise对象。

在这里插入图片描述

封装网络请求

在这里插入图片描述

结果如下:
在这里插入图片描述

分析:
首先的确在初始化的时候是先执行的getMainImg 而后执行 getBottomImg,这个执行的过程是一个同步的过程,但是其内部的方法是异步的,因此我们在执行 getMainImg 的时候并不会堵塞其后的 getBottomImg 执行,这个过程可以理解为我们先执行 getMainImg ,但是 getMainImg 获取的图片很多有十几张,此时网络请求的响应速度和服务器的处理速度会影响这个方法的最终完成的时间。但在这个过程中,JS不会再理他了,而是会去照顾后面的 getBottomImg 。此时他们的生命理论是都已经完成了。但是因为其异步的特性,封装的 promise 对象在接收到信号后会产生回调。而getBottomImg 在网络中只请求了一张图片,因此回调函数就就会抢先一步告诉 JS,我来了! 然后JS就会在控制台输出getBottomImg回调后的内容。紧接着等待getMainImg回调完成再输出 getMainImg 的内容。



3. 异步等待问题

先看一张图,这是大部分人包括我在最初写代码的时候也会这样进行处理,因为业务逻辑经常会有先后关系,比如要出去玩,就要先叫车,要叫车就要先拿出手机,要拿出手机就要先查询我的手机还在不在我的口袋hhh。因此如果业务逻辑复杂的话,你的 .then 回调将会是很长的,整个逻辑将会变得耦合性很高,也不好封装重组。后续新需求的重复逻辑也将变得更加复杂,可维护性将变得很差。在面对这种先后关系的异步回调函数,直接武现俄罗斯套娃是最粗暴的做法。另外就是利用 asyncawait 去更优雅的解决 promise异步回调

在这里插入图片描述
这里的show是封装的uni.app的提示方法

asyncawait 方案
在这里插入图片描述
其实在这里我还有一层逻辑,也就是获取用户登录信息后,判断此openid是否有报名记录。这样的话就能解决先执行登录的所有流程,然后再去判断是否之前报名过。

在这里插入图片描述



在这里的分析过程中遇到一个有趣的问题,我之前以为uni.login返回的是一个promise ,而实际上是一个 array 并且第一个参数还是 null

在这里插入图片描述
在这里插入图片描述

关于这个问题我最终在一个帖子的导航在uni-app 的原文档中找到了答案,链接:

https://uniapp.dcloud.net.cn/api/#vue-2-%E5%92%8C-vue-3-%E7%9A%84-api-promise-%E5%8C%96

因此在做 apipromise 化的时候需要注意这个,不过大多数人都会直接拿下标1的参数,而没有去探究。但是这个问题是有意义的,至少我之前在对原生api 进行 promise 化的时候想用catch去进行拦截错误信息。而内部其实是有拦截的,所以 promise化后是并不能去这样捕捉错误的。错误在参数中。相关信息去看文档。

在这里插入图片描述

PS:解释的如有问题,尽管留言探讨

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台,通过其轻量级的容器技术,使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程,并详细解析其基本概念、组件及常用命令,以帮助读者充分理解和熟练使用 Docker。企业…

【kubernetes】关于k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类: (1)陈述式资源管理方式:增删查比较方便,但是改非常不方便 (2)声明式资源管理方式:yaml文件管理 二、陈述式资源管理方法: 三、ku…

linux查看服务器内核CUP版本相关命令

服务器参考 计算架构:x86-64产品系列:华为云耀云服务器操作系列:CentOS 7 执行uname -a查看服务器内核版本 Linux hecs-82210 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux执行hostn…

【Flink CDC(一)】实现mysql整表与增量读取

文章目录 一. 运行前准备1. 依赖1.1. Maven dependency1.2. SQL Client JAR(推荐) 2. 配置 MySQL 服务器(必须) 二. 功能说明1. 启动模式2. 全量阶段支持 checkpoint3. 关于无主键表Exactly-Once 处理 三. 实战1. 实现mysql整表与…

交叉编译qt到arm平台

使用pkg-config命令查看xxx包是否存在: pkg-config --print-errors xxx pkg-config的搜索路径可以通过环境变量PKG_CONFIG_PATH指定。需要在运行./configure 之前指定。 ./configure -release -qt-libjpeg -qt-libpng -qt-zlib -qt-pcre -xplatform linux-aarch64-…

一文读懂 Python 值传递和引用传递

文章目录 版本前言形参和实参值传递和引用传递Python 变量存储值语义和引用语义值语义引用语义 探讨 Python 值传递和引用传递不可变(immutable)类型可变(mutable)类型案例一案例二 拓展:不可变类型真的不可变&#xf…

华为---RSTP(三)---P/A机制及RSTP的生成树形成过程

目录 1. P/A机制简介 1.1 P/A机制的作用 1.2 P/A协商的前提条件 1.3 RSTP选举思路 2. P/A协商过程 3. 举例说明RSTP的生成树形成过程 3.1 示例环境要求 3.2 RSTP的生成树形成过程 3.2.1 SW和SW1之间链路上抓包分析 3.2.2 SW和SW2之间链路上抓包分析 3.2.3 SW1和SW2之…

LeetCode_Java_转变日期格式、种花问题(题目+思路+代码)

目录 1507. 转变日期格式 605.种花问题 1507. 转变日期格式 给你一个字符串 date ,它的格式为 Day Month Year ,其中: Day 是集合 {"1st", "2nd", "3rd", "4th", ..., "30th", "3…

【计算机图形学】Where2Act: From Pixels to Actions for Articulated 3D Objects

文章目录 1.论文做了件什么事儿2. 论文为什么要做这件事3. 介绍Introduction4. 相关工作预测语义表达推理几何和物体属性从被动观察中学习Affordance从交互中学习感知 5. 问题陈述6. 方法6.1 网络模块主干特征提取器可运动性评分模块运动建议模块运动评分模块 6.2 训练数据收集…

路由器端口映射如何配置?

在网络通信中,路由器是一个重要的设备,它负责将数据包从一个网络传输到另一个网络。路由器的端口映射配置是一种重要的设置,可以使外部网络中的计算机通过访问路由器上的特定端口与内部网络中的计算机进行通信。本文将介绍什么是路由器端口映…

k8s pv与pvc理解与实践

参考文章: https://blog.csdn.net/qq_41337034/article/details/117220475 一、 pv/pvc简述 Pv是指PersistentVolume,中文含义是持久化存储卷是对底层的共享存储的一种抽象,Pv由管理员进行配置和创建,只要包含存储能力&#xff…

【DL】深度学习之语音识别

目录 1 核心概念 2 安装依赖库 3 实践 语音信号处理(Speech Signal Processing)简称语音处理。 语音识别(ASR)和自然语言处理(NLP):语音识别就是将语音信号转化成文字文本,简单实…

Redis 服务集群、哨兵、缓存及持久化的实现原理和应用场景

Redis 是一种高性能的键值存储系统,已经成为了许多企业和互联网公司的核心技术之一。本文将介绍 Redis 的服务集群、哨兵以及缓存实现原理和应用场景,以帮助读者更好地理解和使用 Redis。 引言: 随着互联网应用规模不断扩大,Redi…

Laravel04 eloquent

eloquent 1. eloquent2. 创建eloquent model 以及 取数据 1. eloquent 文档地址: https://learnku.com/docs/laravel/8.x/eloquent/9406 下面是我们,通过laravel的DB类从数据库中获取了post记录,那么有没有可能我们直接获取一个post对象&am…

[算法沉淀记录]排序算法 —— 快速排序

排序算法 —— 快速排序介绍 基本概念 快速排序(Quicksort)是一种排序算法,最早由东尼霍尔提出。在平均状况下,排序 n 个项目要 Ο(n log n) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上&…

Arduino单片机基础介绍

(本文为简单介绍,内容源于网络和AI) Arduino单片机,自2005年诞生以来,已经成为全球爱好者和专业工程师们快速实现创意原型的重要工具。Arduino的普及不仅因其强大的功能和简易的操作,还在于其背后强大的社…

【数据结构】队列OJ题《用队列实现栈》(题库+解析+代码)

1.前言 通过前面队列的实现和详解大家对队列应该有一定熟悉了,现在上强度开始做题吧 队列详解:http://t.csdnimg.cn/dvTsW 2.OJ题目训练225. 用队列实现栈 题目分析 请你仅使用两个队列实现一个后入先出(LIFO)的栈&#xff0…

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来,一直都牵动着世人的心。2023年2月10日,据法新社最新消息,强震已造成土耳其和叙利亚两国超2万人遇难。报道称,相关官员和医护人员表示,地震造成土耳其17674人死亡,叙利亚则有33…

洛谷C++简单题小练习day22—小鱼记忆小程序!一题五解,高效学习

day22--小鱼记忆--2.26 习题概述 题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 ai​(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 0 就不要念出来了)。…

iOS App 上架指南及关键

引言 上架App Store是将iOS应用提交申请并上线的过程,旨在让应用在App Store上展示,吸引用户并获取流量。本文将介绍iOS上架的整体流程,并提供一些建议和注意事项。 一、iOS上架的整体流程 1. 申请开发者账号 首先,需要申请苹…