一、使用云函数读取集合的所有记录
云函数端获取一个集合所有记录的例子,因为有最多一次取 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:
实例
const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() const MAX_LIMIT = 100 exports.main = async (event, context) => { // 先取出集合记录总数 const countResult = await db.collection('todos').count() const total = countResult.total // 计算需分几次取 const batchTimes = Math.ceil(total / 100) // 承载所有读操作的 promise 的数组 const tasks = [] for (let i = 0; i < batchTimes; i++) { const promise = db.collection('todos').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get() tasks.push(promise) } // 等待所有 return (await Promise.all(tasks)).reduce((acc, cur) => { return { data: acc.data.concat(cur.data), errMsg: acc.errMsg, } }) }
运行实例 »
点击 "运行实例" 按钮查看在线实例
思路:分批取出记录,把get()查询返回的promise存入数组,利用reduce方法返回链接的所有记录
核心函数: reduce({function}) 参数是一个函数,依次作用于数组的相邻item,最终返回一个数据。可以返回累计值,比较出最大值等
Promise.all(iterable);参数:iterable一个可迭代对象,如 Array 或 String。
返回值:
如果传入的参数是一个空的可迭代对象,则返回一个已完成(already resolved)状态的 Promise。
如果传入的参数不包含任何 promise,则返回一个异步完成(asynchronously resolved) Promise。注意:Google Chrome 58 在这种情况下返回一个已完成(already resolved)状态的 Promise。
其它情况下返回一个处理中(pending)的Promise。这个返回的 promise 之后会在所有的 promise 都完成或有一个 promise 失败时异步地变为完成或失败。 见下方关于“Promise.all 的异步或同步”示例。返回值将会按照参数内的 promise 顺序排列,而不是由调用 promise 的完成顺序决定
此方法在集合多个 promise 的返回结果时很有用。
二、使用小程序端API读取集合的所有记录
在page的data中初始化空数组,后续按读取循环次数链接新老数据,得到所有记录
核心代码如下:
实例
db.collection('food').where({ 查询条件 }).count().then(res => { var total = res.total // 计算需分几次取 const batchTimes = Math.ceil(total / 20) for (let i = 0; i < batchTimes; i++) { db.collection('food').skip(i * 20).limit(20).where({ 查询条件 }).get().then(res => { let new_data = res.data let old_data = this.data.category this.setData({ category : old_data.concat(new_data) }) }) } })
运行实例 »
点击 "运行实例" 按钮查看在线实例
实战案例:
第二种方法应用在具体的小程序思路:
加载模块: 注意查询语句要用skip(that.data.page_index * page_size)跳过分页加载,否则一直循环加载前20个记录
实例
loadOrder: function () { var page_size = 20; db.collection('order').limit(page_size).skip(that.data.page_index * page_size).get().then(res => { // 请求成功将数据存入orderList that.setData({ orderList: that.data.page_index == 0 ? res.data : that.data.orderList.concat(res.data) }); // 判断上拉加载状态 if (res.length < page_size && that.data.page_index != 0) { that.setData({ loadingTip: '没有更多内容' }); } // holder that.setData({ visual: res.length == 0 && that.data.page_index == 0 ? 'show' : 'hidden' }); }, function(error) { alert("查询失败: " + error.code + " " + error.message); }); },
运行实例 »
点击 "运行实例" 按钮查看在线实例
在触底加载模块调用加载模块,并把页数加1,记录的this.data中
实例
onReachBottom: function () { that.setData({ page_index: ++that.data.page_index }); that.loadOrder(); },
运行实例 »
点击 "运行实例" 按钮查看在线实例