前言:

  小程序开发中诸如获取用户手机号码、调起微信支付、领取卡券等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返回后仍然自动重新调用的异常处理的更多相关文章

  1. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  2. 点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决?

    点击按钮使用window.open打开页面后,再次点击按钮会再打开一个页面,如何解决? window.open("page1.html","win1"); 这句 ...

  3. 微信小程序开发——点击按钮退出小程序的实现

    微信小程序官方是没有提供退出的API的,但是在navigator这个组件中,是有退出这个功能的:详情参考官方文档:navigator.示例代码:1 navigator open-type=" ...

  4. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

    微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...

  5. .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)

    基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题,后面我也会通过实战 ...

  6. Win32 程序开发入门:一个最简单的Win32程序

    一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...

  7. 移动端开发H5页面点击按钮后出现闪烁或黑色背景的解决办法

    H5页面在IOS端测试的时候发现,点击按钮会闪动,出现一个黑色的背景一闪而过,影响用户体验.最后通过度娘,找到解决方法: 就是给点击的元素添加一个CSS属性或者全局添加一个css. -webkit-t ...

  8. 【微信小程序开发】快速开发一个动态横向导航模板并使用

    目标:做个横向导航,可以横向滚动. 思路:使用scroll-view组件,可实现横向滚动功能.scroll-view内包含一个动态的view列表,代表导航的每一项,导航要接收动态数组,然后使用列表展示 ...

  9. 微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由

    前言: 对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的.哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多. 这里就以另外一种方式来详细的介绍小程序的页面栈及路 ...

随机推荐

  1. C语言中的__LINE__宏

    在C语言中,有这么四个预定义的宏: 当前文件: __FILE__ 当前行号: __LINE__ 当前日期: __DATE__ 当前时间: __TIME__ 这4个宏在代码编译的时候,由编译器替换成实际 ...

  2. day13-文件操作

    1.打开与关闭 1.1.open() close()我们使用 open() 函数打开文件.这个函数将返回一个文件对象,我们对文件的读写都将使用这个对象.open() 函数需要三个参数,第一个参数是文件 ...

  3. Linux zookeeper 单机安装

    Zookeeper(端口2181) 下载地址 http://mirror.bit.edu.cn/apache/zookeeper/ 解压到/usr/local目录 >tar -zxvf zook ...

  4. bash: export: “path” not a valid identifier [closed]

    export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin bash: export: “path” not a vali ...

  5. css:调整placeholder样式

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #C5CACF; } input:-moz ...

  6. 尚硅谷redis学习5-初识redis.conf

    redis.conf是redis的配置文件,在解压后的redis安装文件夹下 单位 1  配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit    2  对大小写不敏感 包含 ...

  7. centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod

    centos7启动iptables时报Job for iptables.service failed because the control process exited with error cod ...

  8. 安装vue CLI后, 出现安装权限问题

    问题:安装vue CLI后,出现:npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/usr/l ...

  9. numpy-Randow

    Randow使用 http://blog.csdn.net/pipisorry/article/details/39508417 概率相关使用 转:http://www.cnblogs.com/Nau ...

  10. EF 数据迁移

    数据迁移: 在程序包管理器控制台,执行语句. 初始化: 1.Enable-Migrations -EnableAutomaticMigrations 2.Add-Migration InitialCr ...