微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理
前言:
小程序开发中诸如获取用户手机号码、调起微信支付、领取卡券等api都是会有一定的延迟的。也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一定时间的,连续点击按钮,还是有可能会重复调用的。
虽然这种情况有点极端,正常用户是不会这么连续快速的点击按钮的,但是也不能排除有用户手抖,连续点了两下。如果重复调用的话,不仅体验不好,单击事件中涉及到后端接口操作的也可能引起其他异常。所以这个问题还是要处理下的。
刚开始想到的是使用loading开启模板来防止点击穿透,结果发现loading从调用到蒙板起作用也是需要一定时间的,还是解决不了这个问题(自定义loading加蒙板防点击穿透应该可以的)。后边就想到了采用给按钮添加启用/禁用状态来控制按钮点击的频率——点击按钮,按钮状态设置为禁用,一定时间之后,启用按钮可用状态。经多次验证,此法可行。
处理方法:
1. 设置按钮可用状态:
Page({
data: {
disabled: false //购买按钮是否可用,按钮默认可用,点击一次后置为不可用,一定时间之后恢复可用
},
/**
* 购买按钮点击防重:禁用/启用
*/
buyBtnDisable: function() {
this.setData({
disabled: true
})
var self = this
setTimeout(function() {
self.setData({
disabled: false
})
}, 1000)
}
})
在每一个调用小程序api的按钮单击事件中先调用这个函数,则一定时间之内,这个按钮是禁用状态,就不会再重现重复点及的问题了。
2. 自定义loading:
创建模板或组件loading,在页面中直接使用该模板替代微信loading组件就好了,由于:
loading.wxml
<template name="loading">
<view class='loading'>
<view class='bg'>
<image src='https://lg-gc2dnftu-1257370699.cos.ap-shanghai.myqcloud.com/timg.gif' width="100" height="100"></image>
</view>
</view>
</template>
loading.wxss
.loading{
position: absolute;
top:;
left:;
width:100%;
height:100%;
}
.bg{
background: rgba(0,0,0,0.7);
width:200rpx;
height:200rpx;
margin:50% auto;
border-radius: 10rpx;
padding-top:70rpx;
box-sizing: border-box;
}
.loading image{
display: block;
width:60rpx;
height:60rpx;
margin:0 auto;
}
这样就可以使用自定义loading替代微信小程序原生loading了,经验证,此方法能解决多次点击按钮重复调用api的问题。
关于模板具体使用详见:https://www.cnblogs.com/xyyt/p/9559326.html
结语:
经验证,上边两种方法都能有效解决按钮连续点击重复调用微信api的问题,且两种方法都需要放在单击事件的开头在单击事件中先行运行。
采用设置按钮状态的方法比较独立,只需要在单击事件开头就调用函数就好,函数会在指定时间之后恢复按钮的可点击状态,不会对后续代码有太大影响(但是这种方法会暂时屏蔽按钮的启用状态,指定时间内再次点击是无效的)。
采用自定义loading方式是使用蒙版覆盖了按钮,本质上未对按钮做任何修改,只是在loading展示的期间无法点击而已。缺点就是在后续的代码中关闭loading,loading的关闭也是需要一定时间的。如果是调用获取用户手机号码授权的api,取消授权的时候关闭loading,则会在取消之后,loading还会显示一下再消失,体验有点不太好。
综上,上边两种方法各有优劣,可以根据自己的需要选择使用。
后续改进:
2018.9.27
1. 鉴于方法1会直接改变按钮的可点击状态,设置禁用时间过短则无效,过长则会导致一定时间内按钮点击无反应,而且这个时间不好确定,故选用自定义loading方法;
2. 对loading组件进行改进,新增了 transparent 来控制loading组件加载图标及其半透明的模块背景的显隐:
之所以有这个改进,是针对单击事件中同时有后端接口访问和微信api调用的情况。一般loading是针对服务器端接口访问进行使用的——调用接口之前显示loading,接口响应成功,loading关闭。但如果在调用服务器端接口成功之后需要同步调用微信小程序的api,如下单之后需要调起微信api进行支付,那么在调起微信支付前后也是要使用loading做下蒙板来防止重复点击按钮。
在调用小程序api的过程中直到支付界面展示出来,loading消失,这个过程中,按钮被loading的蒙板挡着,可以有效的防止重复点击。但是对于获取手机号码授权及微信支付都是以弹窗的形式展示的,所以在调用小程序api直到弹窗弹出的过程中,loading是会一直展示的,这样体验就不太好了。解决这个问题,比较好的就是隐藏掉loading的菊花图标及半透明层,也就是仅充当一个透明蒙板来使用,这样即能防止按钮重复点击,也不影响展示。
组件模板代码:
<view class='loading'>
<view class='bg' wx:if="!transparent">
<image src='https://lg-gc2dnftu-1257370699.cos.ap-shanghai.myqcloud.com/timg.gif' width="100" height="100"></image>
</view>
</view>
调用页面业务逻辑代码:
Page({
data: {
loading: false, //默认不显示loading
transparent: false //默认显示loading加载图标,设置为true,则只有蒙板,看不到loading图标
...
},
/**
* 调用微信小程序api的单击事件
*/
clickEventRequestMpaPI: function() {
//调用服务器端api显示loading
this.setData({
disabled: true
})
//调用服务器端api(请求方法已封装)
http.paymentOrder(prams).then(data => {
if (data) {
//调用服务器端api关闭loading
self.setData({
loading: false
})
var d = data;
self.orderId = d.orderNo;
//发起微信支付
//调用微信支付api显示透明无图标的loading
self.setData({
loading: true,
transparent: true
})
wx.requestPayment({
...
'success': function(data) {
//4.1.1查询支付结果
......
},
'fail': function(err) {
console.log("requestPayment fail:::", err)
},
'complete': function(res) {
//调用微信支付api关闭透明无图标的loading
self.setData({
loading: false,
transparent: false
})
}
})
}
})
}
...
})
原创专业博客,转载请注明来源地址:https://www.cnblogs.com/xyyt/p/9708770.html
微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理的更多相关文章
- 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- 点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?
点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决? window.open("page1.html","win1"); 这句 ...
- 微信小程序开发——点击按钮退出小程序的实现
微信小程序官方是没有提供退出的API的,但是在navigator这个组件中,是有退出这个功能的:详情参考官方文档:navigator.示例代码:1 navigator open-type=" ...
- 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint
微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...
- .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题,后面我也会通过实战 ...
- Win32 程序开发入门:一个最简单的Win32程序
一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...
- 移动端开发H5页面点击按钮后出现闪烁或黑色背景的解决办法
H5页面在IOS端测试的时候发现,点击按钮会闪动,出现一个黑色的背景一闪而过,影响用户体验.最后通过度娘,找到解决方法: 就是给点击的元素添加一个CSS属性或者全局添加一个css. -webkit-t ...
- 【微信小程序开发】快速开发一个动态横向导航模板并使用
目标:做个横向导航,可以横向滚动. 思路:使用scroll-view组件,可实现横向滚动功能.scroll-view内包含一个动态的view列表,代表导航的每一项,导航要接收动态数组,然后使用列表展示 ...
- 微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由
前言: 对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的.哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多. 这里就以另外一种方式来详细的介绍小程序的页面栈及路 ...
随机推荐
- linux 显示系统执行的进程
ps -a 显示所有的进程信息 -u 以用户的形式显示系统进程 -x 显示后台进程运行的参数 netstat -anp |more 查看端口 查看开放的端口 vim/etc/sysconfig/ ...
- 20165304学习基础和C语言基础调查
20165304学习基础和C语言基础调查 你有什么技能比大多人(超过90%以上)更好? 我觉得自己应该算是一个比较宅的人,因为在高中的时候我在外边租房子住,我爸妈都去上班,平时就只有我自己,当然只能自 ...
- day13-文件操作
1.打开与关闭 1.1.open() close()我们使用 open() 函数打开文件.这个函数将返回一个文件对象,我们对文件的读写都将使用这个对象.open() 函数需要三个参数,第一个参数是文件 ...
- GitHub创建个人主页
在GitHub,一个项目对应唯一的Git版本库,创建一个新的版本库就是创建一个新的项目.访问仪表板(Dashboard)页面,如图3-1,可以看 到关注的版本库中已经有一个,但自己的版本库为零.在显示 ...
- LeetCode题解:Flatten Binary Tree to Linked List:别人的递归!
总是在看完别人的代码之后,才发现自己的差距! 我的递归: 先把左侧扁平化,再把右侧扁平化. 然后找到左侧最后一个节点,把右侧移动过去. 然后把左侧整体移到右侧,左侧置为空. 很复杂吧! 如果节点很长的 ...
- 应用SharedPreference保存程序的配置信息
SharedPreference: 1.用来保存应用程序的配置信息的XML文件,内部的数据形式为键值对 2.一般存在于/data/data/<包名>shared_prefs目录下 3.该对 ...
- MySQL查询优化(转)
在分析性能欠佳的查询时,应考虑: 1) 应用程序是否正获取超过需要的数据,即访问了过多的行或列. 2) Mysql服务器是否分析了超过需要的行. 如果发现访问的数据行数很大,而生成的结果中数据行很少, ...
- Linux后门入侵检测工具
一.rootkit简介 rootkit是Linux平台下最常见的一种木马后门工具,它主要通过替换系统文件来达到入侵和和隐蔽的目的,这种木马比普通木马后门更加危险和隐蔽,普通的检测工具和检查手段很难发现 ...
- Rafy源码解读 笔记(一) DbMigration
主要功能,提供数据库的升级回滚和变迁操作. 整个模块的都是通过DbMigrationContext这个类来体现的,回滚或升级由若干个子操作完成,每个子操作被封装成一个类MigrationOperati ...
- Linux各种类型压缩包解压缩方法
Linux上经常需要处理各种类型压缩包的解包和打包处理.通常来说会处理最常见的.tar包和.tar.gz包就能解决大部分问题了,但是真碰到其他类型的压缩包还是需要知道如何进行解压缩.这里对Linux上 ...