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

这篇具有很好参考价值的文章主要介绍了巧用回调函数解决微信小程序与后台数据交互出现的异步问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序异步问题怎么解决,Bug千千万,BUG解决方案,异步与同步,微信小程序

问题描述

        微信小程序端需要发送一个包含文字与图片的表单数据给后端,我一开始的思路是上传图片得到临时的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是由于程序执行速度不一致导致的,并不是代码本身的错误,因此非常非常的难找。

 参考文章

微信小程序同步方法与异步方法对比https://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---简介、运行机制及同步异步)https://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 

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

微信小程序异步问题怎么解决,Bug千千万,BUG解决方案,异步与同步,微信小程序文章来源地址https://www.toymoban.com/news/detail-591810.html

到了这里,关于巧用回调函数解决微信小程序与后台数据交互出现的异步问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • “编辑微信小程序与后台数据交互与微信小程序wxs的使用“

    “编辑微信小程序与后台数据交互与微信小程序wxs的使用“

    在现代移动应用开发中,微信小程序已经成为了一个非常流行和广泛使用的平台。为了使小程序能够展示丰富的内容和实现复杂的功能,与后台数据的交互是至关重要的。同时,微信小程序还提供了一种特殊的脚本语言——wxs,用于增强小程序的业务逻辑处理能力。本篇博客

    2024年02月08日
    浏览(17)
  • 【微信小程序】后台数据交互于WX文件使用

    【微信小程序】后台数据交互于WX文件使用

    目录 一、前期准备 1.1 数据库准备 1.2 后端数据获取接口编写 1.3 前端配置接口 1.4 封装微信的request请求   二、WXS文件的使用 2.1 WXS简介 2.2 WXS使用   三、后台数据交互完整代码 3.1 WXML 3.2 JS 3.3 WXSS 效果图  创建数据库: 注意: 字符集选择 utf8mb4 ,因为可能用存储用户信息,

    2024年02月08日
    浏览(14)
  • 微信小程序-绑定数据并在后台获取它

    微信小程序-绑定数据并在后台获取它

    如图 遍历列表的过程中需要绑定数据,点击时候需要绑定数据 这里是源代码 这里有几个点注意: 1、代码别写到最外层的view上了,传不到这个button上 data-product-id=“{{item.productId}}” XXXXX 2、如何点击按钮获取当前的 商品id和上下架状态呢? catchtap=“onShelf” 或者 bindtap=“on

    2024年02月21日
    浏览(17)
  • 微信小程序+SpringBoot接入后台服务,接口数据来自后端

    微信小程序+SpringBoot接入后台服务,接口数据来自后端

    文章底部有个人公众号:小兔教你学编程。主要目的是方便阅读。主要分享一些前后端初中级知识、开发实战案例、问题解决等知识。        前两天开发了一个微信小程序项目,只不过接口数据是自己设置的假数据。然后我就想将这些假数据替换掉。这些数据来自接口,

    2024年02月12日
    浏览(30)
  • Django后台和微信小程序之间使用session方法,出现小程序访问404,Django后台找不到指定的URL问题解决

    在Django后台开启session中间件,小程序端请求Django后台的session属性,在Django中执行session会话操作,并响应应答给小程序,在小程序端执行cookie的缓存和读取操作。 在上述的功能完成后,小程序端访问时出现404错误,Django后台找不到指定的URL路径。 1、排查Django后台的URL路径是

    2024年02月06日
    浏览(16)
  • 微信小程序使用PHP调用后台mysql数据库-小白版

    微信小程序使用PHP调用后台mysql数据库-小白版

    1.域名备案 首先,需要有一个域名,且这个域名是已经备过案的。(如果小程序不发布正式版只用于线上测试则不影响) 2.后台服务器 其次,需要一个服务器,我这里使用的是宝塔面板,对小白很友好,很方便操作。 也可以买个虚拟主机,一个月几块钱左右,很适合小白弄

    2024年04月14日
    浏览(31)
  • 关于微信小程序与Java后台交互数据中中文乱码问题的讨论

    关于微信小程序与Java后台交互数据中中文乱码问题的讨论

    如果小程序端发起的请求参数中含有中文,直接发送到后台会显示乱码,需要在header中设置UTF-8编码 这样后台接收到的中文就能解析正常了 为了便于测试,后台接口简化如下: 结果小程序端显示的用户名为“寮犱笁”。 起初怀疑后台返回的编码格式不对,网上说对于Spring

    2024年02月09日
    浏览(8)
  • APP 跳转微信小程序和回调

    在同一开放平台账号下的移动应用及小程序无需关联即可完成跳转,非同一开放平台账号下的小程序需与移动应用(APP)成功关联后才支持跳转。 可在“管理中心-移动应用-应用详情-关联小程序信息”,为通过审核的移动应用发起关联小程序操作。 App打开下程序有两种方式

    2023年04月09日
    浏览(69)
  • 【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

    【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

            在小程序中,与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互,小程序能够获取服务器端的数据、上传用户数据、发送请求等。         小程序与后台交互可以实现数据的传输、用户认证、实时消息推送等功能,为

    2024年02月08日
    浏览(12)
  • 微信小程序点击头像不触发onChooseAvatar回调

    微信小程序点击头像不触发onChooseAvatar回调

    调试基础库为2.14.1版本时,击头像不触发onChooseAvatar回调 代码如下: 将基础库改为2.30.0后问题解决。效果如图

    2024年02月10日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包