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

news2025/1/25 9:04:47

相信各位在进行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:解释的如有问题,尽管留言探讨

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

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

相关文章

Laravel03 路由到控制器与连接数据库

Laravel03 路由到控制器与连接数据库 1. 路由到控制器2. 连接数据库 1. 路由到控制器 如下图一些简单的逻辑处理可以放在web.php中,也就是路由的闭包函数里面。但是大的项目,我们肯定不能这么写。 为什么保证业务清晰好管理,都应该吧业务逻辑…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录,然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

卡诺图之间的运算(拓展应用)

文章目录 1.卡诺图运算的基本规律⑴卡诺图之间的或运算⑵卡诺图之间的与运算⑶卡诺图之间的异或和同或运算 2.利用卡诺图进行运算(并化简)3.特殊卡诺图与卡诺图模块化⑴异或逻辑函数的卡诺图⑵同或逻辑函数的卡诺图⑶卡诺图的模块化 4.可能的题型&#x…

使用 JMeter 生成测试数据对 MySQL 进行压力测试

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

3分钟看懂设计模式02:观察者模式

一、什么是观察者模式 观察者模式又叫做发布-订阅模式或者源-监视器模式。 结合它的各种别名大概就可以明白这种模式是做什么的。 其实就是观察与被观察,一个对象(被观察者)的状态改变会被通知到观察者,并根据通知产生各自的不…

二 线性代数-向量

1、向量的表示方法: 其中的 i、j、k是坐标轴方向的单位向量。 2、向量的模: 用坐标计算的方法: 3、向量的运算: 3.1 向量的加法减法: 3.2 向量的数乘: 拉格朗日乘数法的 基础 公式。 3.3 向量的数量积&a…

conda 导出/导出配置好的虚拟环境

一. 导出环境配置(yml文件) 1. 在主目录下激活虚拟环境(UE4是我的虚拟环境名称,请根据你自己的名称进行修改) conda activate UE4 2. 运行此代码 conda env export > environment.yml 二. 导入环境配置&#xf…

oracle官网下载早期jdk版本

Java Downloads | Oracle JDK Builds from Oracle 以上压缩版,以下安装版 Java Downloads | Oracle 该链接往下拉能看到jdk8和jdk11的安装版 -- end

每日一题 — 移动零

力扣链接:283. 移动零 - 力扣(LeetCode) 思路:利用双指针将数组分为三个区间,三个区间分别表示的是:非0元素、0、待处理元素 当arr[cur] ! 0时 [0,dest]区间就需要加一,所以dest 然后再交换a…

Java SpringBoot 获取 yml properties 自定义配置信息

Java SpringBoot 获取 yml properties 自定义配置信息 application.yml server:port: 9090servlet:context-path: /app第一种方法 HelloController package com.zhong.demo01.controller;import org.springframework.beans.factory.annotation.Value; import org.springfram…

Python字符串切片操作原来这么简单!

字符串切片是Python中用于从字符串中提取子串的强大工具。通过指定开始和结束下标,以及可选的步长参数,可以轻松地截取字符串的一部分。 1.字符串切片原理 从字符串中复制指定的一段代码,生成一个新的字符串 2.字符串切片语法 字符串[开始…

2018-02-14 新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】

2018-02-14新闻内容爬虫【上学时做论文自己爬新闻数据,原谅我自己懒发的图片】资源-CSDN文库https://download.csdn.net/download/liuzhuchen/88878591爬虫过的站点: 1QQ新闻 1,准备爬取滚动新闻页面 2 通过F12 开发工具查找发现&#xff…

Linux配置JDk环境

下载jdk 官网地址:Java Downloads | Oracle 将下载的jdk上传到服务器 不管你使用什么工具和方法,只要将安装包上传到服务器就可以了 解压文件 tar -xvf jdk-8u341-linux-x64.tar.gz 配置环境变量 用vim /etc/profile进入编辑状态,加入下边…

python中的数字类型Number

Python 数字(Number) Python 数字数据类型用于存储数值。 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。 以下实例在变量赋值时 Number 对象将被创建: var1 1 var2 10Python 支持三种不同的数值类型…

2024年阿里云服务器新购、续费、升级优惠政策汇集!

2024年阿里云服务器购买、续费、升级优惠政策整理,阿里云服务器优惠价格表:轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年,云服务器4核16G10M带宽26元1个月、149元半年,阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价…

【开源】使用opencv进行交互式抠图,让你开发效率翻倍

这是一个简单的交互式图像分割应用程序,由python opencv和pyqt编写。 这个应用程序在opencv中应用Grabcut算法对图像进行抠图。Grabcut是Graphcut算法的改进版本。查看这些论文(paper1, paper2)了解详细信息~~ gui部分主要来自这个伟大的工作labelImg。这是一个非常…

【报错处理】命令提示符安装npm install yarn -g失败两种解决方法

目录 方法1:方法2: 方法1: 等待两分钟后发现总是显示如下报错: 在搜索栏搜索命令提示符,将命令提示符以管理员身份运行,如果弹出窗口选择“是”。 3.接着输入命令,结果还是报错,方…

【手机端测试】adb基础命令

一、什么是adb adb(Android Debug Bridge)是android sdk的一个工具 adb是用来连接安卓手机和PC端的桥梁,要有adb作为二者之间的维系,才能让用户在电脑上对手机进行全面的操作。 Android的初衷是用adb这样的一个工具来协助开发人…

某电力铁塔安全监测预警系统案例分享

项目概述 电力铁塔是承载电力供应的重要设施,它的安全性需要得到可靠的保障。但是铁塔一般安装在户外,分布广泛,且有很多安装在偏远地区,容易受到自然、人力的影响和破环。因此需要使用辅助的方法实时监控铁塔的安全状态&#xff…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins,选择一个最新稳定版本,避免一些插件不兼…