巧用回调函数解决微信小程序与后台数据交互出现的异步问题

news2025/4/5 21:45:05

问题描述

        微信小程序端需要发送一个包含文字与图片的表单数据给后端,我一开始的思路是上传图片得到临时的URL,执行POST请求将表单数据发送给后端,但后端只能获取到文字,而图片URL却始终获取不到。

问题原因

        注意看我上面的思路,一先一后,无形中将两个操作进行异步执行了,顾名思义,两个行为分开同时执行,但是二者执行速度却不一致从而导致出错。因为图片的上传执行速度肯定比发送POST请求这一动作要慢一步,因为耗时长,还会受网络速度的影响。所以当后台已经收到小程序端发来的POST请求时,图片上传还未完成,因此URL就是空的,等到图片上传完成了拿到URL了,但此时POST请求早已执行完毕,二者相互错开,异步执行是问题的根本原因。

错误代码

//表单提交事件
        ReportFormData(e){
            wx.showLoading({
                title: '上传中',
              })
            this.setData({
                formdata:e.detail.value
            })
            this.uploadimg()//上传图片获取URL
            //向后端发送POST请求提交表单数据
            wx.request({
                url: 'http://localhost:8081/wx/hd/add',
                method:"POST",
                data:JSON.stringify({
                  "sbr":userid,
                  "yhdd":form.yhdd,
                  "yhbw":form.yhbw,
                  "yhms":form.yhms,
                  "yhzp":[{ "url":res3.fileList[0].tempFileURL}]
                }),
                header:{'content-type': 'application/json'},
                success:res=>{
                    wx.showToast({
                      title: '上传成功',
                    })
                    console.log(res);
                }
              })
        },
        //将用户上传的隐患照片上传到云数据库中进行存储
        uploadimg(){
            wx.cloud.uploadFile({
                //  使用随机生成数来为图片文件命名,极大避免文件名冲突问题
                cloudPath:`${Math.floor(Math.random()*10000000)}.png`,
                filePath:this.data.imgs[0],
                success:res2=>{
                    console.log(res2)
                    //获取图片的临时下载链接
                    wx.cloud.getTempFileURL({
                        fileList:[res2.fileID],
                        success:res3=>{
                            this.setData({
                                filepath:res3.fileList[0].tempFileURL
                            })
                            console.log("获取到的url地址为:",this.data.filepath)
                            wx.hideLoading()
                        }
                    })
                }
            })
            console.log("上传的图片",this.data.imgsfileIDs)
        },

解决方法

        将二者进行同步操作,就是顺序执行,当图片上传完成拿到URL之后再去执行发送POST请求的操作,即后者执行的条件是前者执行完成,这样让后者“等一等”前者,这是解决问题的核心思路。我们这里采用的方法是在上传图片拿到URL后的回调函数中来执行POST请求,这样巧妙地利用了回调函数的特点解决了异步问题。

正确代码

       //表单提交事件
        ReportFormData(e){
            wx.showLoading({
                title: '上传中',
              })
            this.setData({
                formdata:e.detail.value
            })
            this.uploadimg()//上传图片获取URL
        },
         
        //将用户上传的隐患照片上传到云数据库中进行存储
        uploadimg(){
            wx.cloud.uploadFile({
                //  使用随机生成数来为图片文件命名,极大避免文件名冲突问题
                cloudPath:`${Math.floor(Math.random()*10000000)}.png`,
                filePath:this.data.imgs[0],
                success:res2=>{
                    console.log(res2)
                    //获取图片的临时下载链接
                    wx.cloud.getTempFileURL({
                        fileList:[res2.fileID],
                        success:res3=>{
                            let userid=getApp().globalData.userOpenID
                            let form=this.data.formdata
                            //向后端发送POST请求提交表单数据
                            wx.request({
                                url: 'http://localhost:8081/wx/hd/add',
                                method:"POST",
                                data:JSON.stringify({
                                  "sbr":userid,
                                  "yhdd":form.yhdd,
                                  "yhbw":form.yhbw,
                                  "yhms":form.yhms,
                                  "yhzp":[{ "url":res3.fileList[0].tempFileURL}]
                                }),
                                header:{'content-type': 'application/json'},
                                success:res=>{
                                    wx.showToast({
                                      title: '上传成功',
                                    })
                                    console.log(res);
                                }
                              })
                            this.setData({
                                filepath:res3.fileList[0].tempFileURL
                            })
                            console.log("获取到的url地址为:",this.data.filepath)
                            wx.hideLoading()
                        }
                    })
                }
            })
        },

总结

        除非必要时候,否则尽量使用同步方法,即顺序执行程序,避免使用异步方法造成不必要的隐患问题,这样的BUG是由于程序执行速度不一致导致的,并不是代码本身的错误,因此非常非常的难找。

 参考文章

微信小程序同步方法与异步方法对比icon-default.png?t=N0U7https://blog.csdn.net/hxfghgh/article/details/82817943?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167544181616800182143390%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167544181616800182143390&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-82817943-null-null.142^v73^pc_new_rank,201^v4^add_ask,239^v1^control&utm_term=%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%90%8C%E6%AD%A5%E4%B8%8E%E5%BC%82%E6%AD%A5&spm=1018.2226.3001.4187微信小程序(API---简介、运行机制及同步异步)icon-default.png?t=N0U7https://blog.csdn.net/weixin_45343973/article/details/100977882?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%90%8C%E6%AD%A5%E4%B8%8E%E5%BC%82%E6%AD%A5&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-100977882.142^v73^pc_new_rank,201^v4^add_ask,239^v1^control&spm=1018.2226.3001.4187 

道阻且长,多踩坑才能成长!

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

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

相关文章

目标检测研究

传统的目标检测流水线 1.候选区域生成 通过滑动窗口选择感兴趣区域Rol;使用多尺寸的输入图像和多尺度的滑动窗口识别多尺度和不同比例的目标。 ⒉特征向量抽取 常用SIFT、 Harr、HOG、SURF。 3.区域分类 常用支持向量机。 结合集成、串联学习、梯度…

3D俯视角色割草游戏模板+视频教程,免费发布 | 一周精品推荐

大家好,我是晓衡。新年开工第一周,我就被热心的开发者们感动得热泪盈眶!今天我冒死推荐几款 Creator 游戏开发资源,希望能对得起这些开发者们,同时也希望你能也有所收获。3D俯视角割草游戏视频源码B 站 UP 主『好巧啊c…

MyBatis 数据查询语句中有关于大于,小于的书写方法 及 查询时相关sql 关键字

前言 提示:这里记录的大概内容: MyBatis 数据查询语句中有关于大于,小于的书写方法 一、MyBatis MyBatis 本是 apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为…

Python封装、继承和多态

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”。同时,Python 也支持面向对象的三大特征:封装、继承和多态。 一、封装 封装(Encapsulation),即在设计类时&am…

讲师邀请 | 在 DevData Talks,开放务实地聊聊研发效能!

什么是 DevData Talks? DevData Talks 是专注于研发效能实践经验与方法论的系列分享活动。 2022 年,我们既看到外部环境变幻莫测,也看到研发效能领域沉下心来稳步发展,从宏大的概念和价值,转向具体的问题&#xff0c…

若依框架代码自动生成器研究-表查询篇

最近生产环境用了一个开源系统:若依,其中有一个版块很有意思,很能提高生产效率: “代码生成器”。 其功能所处模块菜单为:系统工具->代码生成。我们来研究一下他的代码生成逻辑。 工具使用方法 1、建表 使用代码生成&#…

Python列表中你所不知道的事

1. 引言 目前,Python是世界上使用最广泛、最受欢迎的编程语言之一。Python丰富的功能性使它非常流行,因为我们可以使用它创建任何内容。我将在本博客中与大家分享关于Python列表的几条有趣的花絮。 闲话少说,我们直接开始吧! 2.…

如何高薪入职心仪的公司

序 本文首发自:稀土掘金、思否 我们从几个问题开始入手,来看一下本博客是否适合你: 如果你想要换工作,但是:制作的简历平平无奇如果你想要换工作,但是:投放了的简历总是无法得到 [心仪公司] 的…

SpringBoot+Vue茶叶商城系统

简介:本项目采用了基本的SpringBootVue设计的茶叶商城系统。详情请看主要截图。经测试,本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVue茶叶商城系统源码作者LHL项目类型Java EE项目 (…

C#windows彩票信息管理

摘要:近年来,中国彩票行业已经进入市场急速扩张和加速上升的阶段,即开票占整个彩票销量的比率也将急剧上扬。自助售彩终端,这一崭新的售彩模式已被中国彩民接受,爆发点很快来临。到2020年,我国多功能彩票自…

百趣代谢组学文献分享:OnPLS方法在哮喘领域应用研究

百趣代谢组学文献分享,本周分享的文献题目为OnPLS-Based Multi-Block Data Integration: A Multivariate Approach to Interrogating Biological Interactions in Asthma,是由日本前桥群马大学创新研究中心Craig E. Wheelock教授课题组在2018年发表于Ana…

商业智能 BI 人员的六个Level,你到了哪一层?

现在商业智能 BI 行业的从业人员越来越多,但很多人对于自己的职业规划可能并不是特别的清晰,不知道在这个细分领域到底有多大的成长空间,未来大概可以走到哪一个层次。 今天大概介绍下这六个层次,可以是大多数从事商业智能 BI 工…

【计算机程序设计思想与方法】1 什么是计算?

计算是利用计算机解决问题的过程,计算机科学是关于计算的学问。 计算机科学家在用 计算机解决问题时形成了特有的思维方式和解决方法,即计算思维。 1.1 什么是计算? 1.1.1 计算机与计算 计算机是当代最伟大的发明之一。 自从人类制造出第一台电子数字计算机,迄今已近 …

面试题-Java集合常见问题

1 常见集合集合相关类和接口都在java.util中,主要分为三中List(列表)、Map(映射)和Set(集合)其中Collection是集合List、Set的父接口,它主要有两个子接口:List:存储的元素有序,可重复。ArrayList基于数组实现LinkedLis…

STM32开发(二)CubeMX详解构建基本框架

文章目录STM32 CubeMX背景STM32 CubeMX基本配置选择芯片型号新建工程配置系统时钟、调试口、GPIO配置时钟配置配置GPIO (LED为例)GENERATE CODE 生成代码使用工具:CubeMX STM32 CubeMX背景 玩过STM32单片机的朋友都知道,以前的时…

网络协议栈简单设计(udp)

网络协议栈简单设计 操作系统内核中实现了网络协议栈,但今天利用netmap(也可利用dpdk)绕过内核协议栈进行网络数据的收发 netmap 内核协议栈加载数据: 数据从网卡到内核再到内存,需要经过两次拷贝 netmap映射数据&…

List底层源码剖析之List扩容机制

在list集合中有一个add方法: 在众多类中,最长使用的是ArrayList,其中有个方法是add方法 在add方法底层存在 private int size; ensureCapacityInternal(size 1) 其中的size1会对add()方法的调用次数进计数&#x…

Docker系列(常用命令) 02

Docker常用命令总结 docker官方命令文档 一、Docker环境信息命令 docker version # 查看docker版本信息 docker info # 查看docker详细信息二、系统日志信息常用命令 2.1 docker events 作用:从服务器获取实时事件,比如:启动、关闭和创…

九龙证券|美国散户疯狂抄底,嗅到了什么?华尔街最新警告

当地时间周五,美股三大指数低开后经历“过山车”行情,虽然盘中一度转涨,但午后再度回落。截至收盘,道指跌0.38%,报收33926.01点;纳指跌1.59%,收于12006.95点;标普500指数跌1.04%&…

九龙证券|全市场注册制下 多层次资本市场定位更清晰

全商场施行注册制的启动,让多层次本钱商场各个板块之间的定位愈加明晰。沪深交易所主板将杰出大盘蓝筹定位,各个板块互联互通也在逐渐加强。 分析人士认为,全面施行股票发行注册制是一场触动本钱商场全局的革新。注册制在全商场推广后&#x…