- 可以支持异步 setData 吗?
目前在 async/await 中参入回调式 setData 函数显得非常别扭,举个列子,我希望在请求完成后不论成功与否都处理一些单独的业务逻辑: try { const { data: res } = await fetch.getRes('/get', { page: 1, limit: 10 }) if (res.code === 0) { this.setData({ count: res.data.count, list: res.data.list }, () => { doSomeThings1() doSomeThings2() }) } else { wx.showToast({ title: res.data.msg, icon: 'none' }) doSomeThings1() doSomeThings2() } } catch (err) { wx.showToast({ title: '服务器开小差了', icon: 'none' }) doSomeThings1() doSomeThings2() } 会看到上面出现了大量重复代码,增加代码阅读成本,降低开发效率。当然,可以单独封装一下逻辑,例如下面这样: const doThings = () => { doSomeThings1() doSomeThings2() } try { const { data: res } = await fetch.getRes('/get', { page: 1, limit: 10 }) if (res.code === 0) { this.setData({ count: res.data.count, list: res.data.list }, doThings) } else { wx.showToast({ title: res.data.msg, icon: 'none' }) doThings() } } catch (err) { wx.showToast({ title: '服务器开小差了', icon: 'none' }) doThings() } 这时候仍然可以看到出现了三次重复的逻辑。 如果有 setDataAsync 方法,代码看上去会像下面这样更加简洁: try { const { data: res } = await fetch.getRes('/path', { page: 1, limit: 10 }) if (res.code === 0) { await this.setDataSync({ count: res.data.count, list: res.data.list }) } else { wx.showToast({ title: res.data.msg, icon: 'none' }) } } catch (err) { wx.showToast({ title: '服务器开小差了', icon: 'none' }) } doSomeThings1() doSomeThings2() 当然,也许可以自己定义一个 setDataAsync 方法,像这样: Page({ /** * 异步设置数据 * @param {Record<string, any>} data * @returns {Promise<void>} */ setDataAsync(data) { return new Promise(resolve => void this.setData(data, resolve)) } }) 可是上面这么做存在一些问题: 每个页面/组件都需要手动写上该方法,仍然会增加大量的重复代码。结合 TypeScript 时,无法和 setData 一样获得良好的代码补全(setData 方法可以获得在 data 中定义的属性并自动补全)。 以上是目前我开发时遇到的问题,目前能想到的方案是支持异步 setData,可以考虑两种方式: 让原有的 setData 返回 Promise,原有 callback 保持不变。新增 setDataAsync 异步方法。个人认为第一种方式更好些,希望开发团队考虑下。
2022-03-28 - 微信支付商户风控处理-「企业付款」补充说明业务模式及资金结算清分路径、企业付款用途范本(简版)
前言 当遇到企业付款产品冻结,申诉时需要提交补充说明业务模式及资金结算清分路径、企业付款用途 (包括企业付款场景 ,付款用途,付款规则)时,很多人不知道该如何去写,现在提供一个参考说明 商户企业付款产品交易场景说明 商户名称:(商户主体名称) 商户号:(需要处理风控的微信支付商户号) 联系人姓名:(可以为法人,也可以为其他处理风控人员的姓名) 联系人电话:(对应联系人手机号) 使用产品:______________________________(企业付款到零钱/企业红包/企业付款到银行卡,多个就写多个) 本公司承诺,《商户企业付款产品交易场景说明》所述内容均属实,财付通有权进行不定期检查,如发现本公司存在隐瞒事实的行为,财付通有权按照《微信支付服务协议》的约定采取延迟资金结算、关闭支付权限等措施,并中止或终止提供支付服务。 【交易款项】 1.请简要介绍贵司主营业务、说明贵司使用企业付款到零钱/企业红包/企业付款到银行卡向用户支付的是何种款项,付款金额是否有规律或特征(如交易款项结算,营销活动推广奖励,提成/佣金,劳务报酬/薪酬等); 【付款原因】 2.贵司基于什么原因向这些用户付款,公司与个人收款用户之间为何种关系(此处应详细描述付款原因,付款原因应可理解、逻辑应自洽); 【资金来源】 3.请简要说明贵司使用企业付款支付出去的资金来源是什么(充值/收款户); 【交易时间】 4.企业付款的交易频次及时间(付款交易是否有时间分布上的规律,什么时间付,多久付一次); 【收款人信息】 5.企业付款交易通过什么方式获取收款人微信的openID或银行账号 (此处应详细描述openID的获取方式,并提供APP/小程序/公众号的具体名称)。
2021-04-29 - 小程序防止重复点击或重复触发事件
可设置全局变量和全局函数,直接使用app唯一实例调用,方便快捷。 在app.js下 App({ globalData: { PageActive: true }, preventActive (fn) { const self = this if (this.globalData.PageActive) { this.globalData.PageActive = false if (fn) fn() setTimeout(() => { self.globalData.PageActive = true }, 1500); //设置该时间内重复触发只执行第一次,单位ms,按实际设置 } else { console.log('重复点击或触发') } } }) 其他page下调用 index.wxml <button bindtap="tap">点击</button> index.js Page({ tap (e) { getApp().preventActive(()=>{ //code... }) } })
2021-01-12