- 小程序里可以使用async await语法吗
这几天在云开发开发小程序的过程中遇到一个很棘手的逻辑问题, 需求是这样的: 在线考试小程序场景,每个科目会把题库(按100个题算)分成10天来完成 (比如day1是[01,02,03,04,05,06,07,08,09,10]这10个题), 每天只能做一个Day的试题,现在问题是:当我们来到小程序需要答题的时候,是从哪一个Day开始做? 数据库有以下两个集合 1、days,用于维护每个day跟试题id的信息, [ {day1,[01,02,03,04,05,06,07,08,09,10]}, {day2,[11,12,13,14,15,16,17,18,19,20]} ] 2、historys,用于维护用户答题的历史,比如 [ {openid,day1}, {openid,day2} ] 实现的方式有很多种: 1、promise.all 2、async await 本文采用async await方式,那么在小程序中可以使用这种语法吗?经过了解,目前不需要引入其他库是可以正常使用的,但是需要设置一下。 小程序代码中如果用上述语法,在本地设置里面必须选中下图的增强编译,其实这里也是默认选中的 占位符 [图片] 占位符 那么在进考试的时候就要确定是做哪一天的?具体逻辑如下 1、取这个科目所有的day信息,这里面每条记录包含了当天的题目编号列表,比如[day1,day2,day3,day4,day5,day6,day7,day8,day9,day10] 2、取当前微信用户已经做过的day信息,比如这个用户已经做完了[day1,day2] 3、取上面两个集合的差集[day3,day4,day5,day6,day7,day8,day9,day10],取差集中的第一项也就是day3作为当前答题的试卷 这个逻辑可以用promise.all,但是我在实现的时候选择了async,具体代码如下 [图片] 占位符 [图片] 占位符 [图片] 当求得这两个数组之后,我们取数组的差集,就找出所有未做的day,从中任取一天便可以完成上述需求。 通过该文,我们学习了以下知识点 1、async await在小程序中是否可用 2、如何实现两个数组的差集 3、小程序云开发,数据查询具体如何使用async await 本文完
2020-02-22 - BookChat v2.3 发布,通用书籍阅读小程序,增加分享海报和广告功能
BookChat 介绍 BookChat - 面向程序员的开源书籍和文档阅读学习小程序,同时也是一款基于 Apache 2.0 开源协议进行开源的通用书籍阅读微信小程序。 它非常轻量,200KB 左右的大小,麻雀虽小五脏俱全,该有的功能一个没少;同时参照了腾讯官方的 微信小程序设计指南 进行设计,拥有简洁美观的页面和良好的用户体验。 升级日志 抽屉兼容优化:部分安卓手机机型,阅读页面抽屉间距不合理,以致书籍目录和阅读偏好设置部分被遮挡 阅读体验优化:打开书籍阅读,自动跳转到上次阅读的位置,再也不用担心忘记上次阅读到了哪里 增加广告功能:微信小程序如需添加微信小程序广告,只需修改[代码]config.js[代码]的配置项 [代码]// 横幅广告id,如果申请了腾讯小程序的广告,则创建一个横幅广告,把广告的AdUnitId粘贴进来即可,不投放广告,则把该值设置为空 const bannerAdUnitId = '' [代码] 增加分享海报:分享到朋友圈,也没有那么困难重重了 使用了海报生成组件库: https://github.com/kuckboy1994/mp_canvas_drawer [图片] 其它若干小细节优化 相关地址 BookChat 开源地址 Gitee(码云): https://gitee.com/truthhun/BookChat Github: https://github.com/truthhun/BookChat BookChat 后端程序 BookStack 开源地址 Gitee(码云): https://gitee.com/truthhun/BookStack Github: https://github.com/truthhun/BookStack BookChat 体验码 [图片]
2019-08-14 - 实战分享: 小程序云开发玩转订阅消息(二)
[图片]这是实战分享: 小程序云开发玩转订阅消息的第二部分 第一部分链接 《实战分享: 小程序云开发玩转订阅消息(一)》 将订阅消息存入云开发数据库接下来我们创建一个云函数 [代码]subscribe[代码] ,这个云函数的作用是将用户的订阅信息存入云开发数据库的集合 [代码]messages[代码] 中,等待将来需要通知用户时进行调用。 在微信开发者工具的云开发面板中创建数据库集合 [代码]messages[代码] [图片]微信开发者工具新增数据库集合 创建一个 [代码]subscribe[代码] 云函数,在云函数中我们将小程序端发送过来的课程订阅信息,存储在云开发数据库集合中,开发完成后,在微信开发者工具中右键上传并部署云函数。 cloudfunctions/subscribe/index.js [代码]const cloud = require('wx-server-sdk'); cloud.init(); const db = cloud.database(); exports.main = async (event, context) => { try { const {OPENID} = cloud.getWXContext(); // 在云开发数据库中存储用户订阅的课程 const result = await db.collection('messages').add({ data: { touser: OPENID, // 订阅者的openid page: 'index', // 订阅消息卡片点击后会打开小程序的哪个页面 data: event.data, // 订阅消息的数据 templateId: event.templateId, // 订阅消息模板ID done: false, // 消息发送状态设置为 false }, }); return result; } catch (err) { console.log(err); return err; } }; [代码]利用定时触发器来定期发送订阅消息接下来我们需要实现一个定时执行的云函数[代码]send[代码],来检查数据库中是否有需要发送给用户的订阅消息。如果有需要发送的订阅消息,会通过云调用 [代码]cloud.openapi.subscribeMessage.send[代码] 将订阅消息发送给用户。 创建一个名叫 [代码]send[代码] 的云函数,首先要配置云函数,在 [代码]config.json[代码] 的 [代码]permissions[代码] 中新增 [代码]subscribeMessage.send[代码]的云调用权限,然后新增一个 [代码]sendMessagerTimer[代码] 的定时触发器,定时触发器的语法和 [代码]linux[代码] 的 [代码]crontab[代码] 类似,比如,我们配置的 [代码]"0 * * * * * *"[代码] 代表每分钟执行一次云函数。 cloudfunctions/send/config.json [代码]{ "permissions": { "openapi": ["subscribeMessage.send"] }, "triggers": [ { "name": "sendMessagerTimer", "type": "timer", "config": "0 * * * * * *" } ] } [代码]接下来是实现发送订阅消息的云函数,这个云函数会从云开发数据库集合[代码]messages[代码]中查询等待发送的消息列表,检查数据库中是否有需要发送给用户的订阅消息,发送条件可以根据自己的业务实现,比如开课提醒可以根据课程开课日期来检查是否需要发送订阅消息,在我们下面的代码示例里做了简化,筛选条件只检查了状态为未发送。 查询到待发送的消息列表之后,我们会循环消息列表,依次发送每条订阅消息,发送成功后将数据库中消息的状态改为已发送。 cloudfunctions/send/index.js [代码]const cloud = require('wx-server-sdk'); exports.main = async (event, context) => { cloud.init(); const db = cloud.database(); try { // 从云开发数据库中查询等待发送的消息列表 const messages = await db .collection('messages') // 查询条件这里做了简化,只查找了状态为未发送的消息 // 在真正的生产环境,可以根据开课日期等条件筛选应该发送哪些消息 .where({ done: false, }) .get(); // 循环消息列表 const sendPromises = messages.data.map(async message => { try { // 发送订阅消息 await cloud.openapi.subscribeMessage.send({ touser: message.touser, page: message.page, data: message.data, templateId: message.templateId, }); // 发送成功后将消息的状态改为已发送 return db .collection('messages') .doc(message._id) .update({ data: { done: true, }, }); } catch (e) { return e; } }); return Promise.all(sendPromises); } catch (err) { console.log(err); return err; } }; [代码]最终效果 [图片]开课提醒订阅消息截图 源代码https://github.com/binggg/tcb-subscribe-demo[3] 参考资料 [1]注册小程序帐号: https://tencentcloudbase.github.io/2019-09-03-wx-dev-guide-register/ [2]开通云开发服务: https://tencentcloudbase.github.io/2019-09-03-wx-dev-guide-service/ [3]https://github.com/binggg/tcb-subscribe-demo: https://github.com/binggg/tcb-subscribe-demo
2019-10-23