1小时前小编发现微信小程序用户:【喵老师】提出了一个关于“可以支持异步 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 异步方法。
个人认为第一种方式更好些,希望开发团队考虑下。
注:以上是微信小程序开发者:"喵老师"对于本问题的一些阐述,这里做一个引用,我们将实时关注微信小程序助手对该问题提出的解决方案。
【45分钟前】微信小程序技术运营专员对用户喵老师提出的可以支持异步 setData 吗?给予如下回复
有个基础的说明: setData 总体上说是同步的。绝大多数情况下,不需要等到 setData 回调再执行之后的逻辑。(那样反而会拖慢整体的流程,因为 setData 的回调是在渲染线程已经确认界面更新之后,有时会非常非常晚。)
微信官方智能微信小程序适用搜索触达微信小程序,适用包括微信官方系产品及全部浏览器上访问,将来以至于还适用在智能家居系统上运行,这能够让开发人员真实实现开口吸纳流量、收口留存客户的目的。微信官方的智能技术很高,因而微信小程序的技术也强大到别的服务平台不能比拟。
如果您也在使用微信小程序,请关注我们,如果您有关于微信小程序的使用问题请关注我们,如果您要找百度小程序模板、微信小程序模板请关注小程序模板网或者去微信开放社区找官方人员给予解决,相信微信官方在小程序上的发力会是一个里程碑!