取集合所有数据

小程序端与云函数端的表现会有如下差异:

  • 小程序端:如果没有指定 limit,则默认且最多取 20 条记录。

  • 云函数端:如果没有指定 limit,则默认且最多取 100 条记录。

获取集合中的所有待办事项清单:因为有默认 limit 100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:

云函数端

// 云函数入口文件
const cloud = require('wx-server-sdk')
​
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,
  throwOnNotFound: false
})
const db = cloud.database()
const MAX_LIMIT = 2
// 云函数入口函数
exports.main = async (event, context) => {
 // 先取出集合记录总数
 const countResult = await db.collection('test').count()
 console.log(countResult)
 const total = countResult.total
 // 计算需分几次取
 const batchTimes = Math.ceil(total / MAX_LIMIT)
 // 承载所有读操作的 promise 的数组
 const tasks = []
 for (let i = 0; i < batchTimes; i++) {
   //get()操作返回的是Promise对象,每获取一个Promise就压栈进入tasks数组
   const promise = db.collection('test').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
   tasks.push(promise)
 }
 console.log(tasks)
 console.log(await Promise.all(tasks))
 // 等待所有
 /* Promise.all 方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
  在任何情况下,Promise.all 返回的 promise 的完成状态的结果都是一个数组。
  在这里,返回的数组的元素就是res.data
  数组reduce操作:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
  total  必需。初始值, 或者计算结束后的返回值。
  currentValue  必需。当前元素
  currentIndex  可选。当前元素的索引
  arr  可选。当前元素所属的数组对象。
  initialValue  可选。传递给函数的初始值
  **此处acc为初始值,cur为当前元素
  concat() 方法用于连接两个或多个数组
 */
 return (await Promise.all(tasks)).reduce((acc, cur) => {
   return {
     data: acc.data.concat(cur.data),
     errMsg: acc.errMsg,
   }
 })
}
超级计算器小程序码

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐