深入小程序云开发之云函数 第二部分 黑暗中摸索

3 篇文章 0 订阅
3 篇文章 0 订阅

第二部分 黑暗中摸索

 

官方给的一个较简单的login云函数如下:

------------------------------------------------------------------

const cloud = require('wx-server-sdk')

// 初始化 cloud

cloud.init()

exports.main = (event, context) => {

            return {

                        openid: event.userInfo.openId,

            }

}

------------------------------------------------------------------

说明:只返回了一组json格式的数据,只有一个字符串类型的值openid。

 

一个稍微复杂的版本如下:

------------------------------------------------------------------

 

const cloud = require('wx-server-sdk')

 

// 初始化 cloud

cloud.init()

 

/**

 * 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端

 *

 * event 参数包含小程序端调用传入的 data

 *

 */

exports.main = (event, context) => {

  console.log(event)

  console.log(context)

 

  // 可执行其他自定义逻辑

  // console.log 的内容可以在云开发云函数调用日志查看

 

  // 获取 WX Context (微信调用上下文),包括 OPENID、APPID、及 UNIONID(需满足 UNIONID 获取条件)

  const wxContext = cloud.getWXContext()

 

  return {

    event,

    openid: wxContext.OPENID,

    appid: wxContext.APPID,

    unionid: wxContext.UNIONID,

  }

}

------------------------------------------------------------------

至于官方文档中那个“我的第一个云函数”

------------------------------------------------------------------

exports.main = async (event, context) => {

  return {

    sum: event.a + event.b

  }

}

------------------------------------------------------------------

更是绣花枕头。兴师动众搞个云函数调用就是为了计算a+b这种小儿科。简直是对资源的极大浪费。

 

以上模板小程序太过简单,与实际开发相距甚远。因而没有什么实用性。

在实际开发中往往要与数据库的查询、更新打交道。例如返回一批记录、按照一定的条件更新某些记录的某个字段等等。

然而这些云函数的高级用法,官方文档基本没怎么触及。网上漫天蔽野的也都是a+b这种复制抄袭的文章。

不管怎么问度娘,只有一些捕风捉影的只言片语,而且几乎都没有完整代码和工程。云函数就好像是江湖上失传多年的盖世神功。只能耳闻不可亲见。

对于Promise这种语法几乎是门外汉的我来说,那些片段代码看得几乎如同天书。

 

 

但是有三个资源让我有所领悟(至于是否悟通,还有待检验):

第一组是官方文档:云函数中调用数据库

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/wx-server-sdk.html

const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database()

exports.main = async (event, context) => {

  // collection 上的 get 方法会返回一个 Promise,因此云函数会在数据库异步取完数据后返回结果

  return db.collection('todos').get()

}

其中明确说了 get 方法会返回一个 Promise。

 

 

第二组是解决小程序云函数操作数据库回调不执行

https://www.cnblogs.com/ciao-sora/p/10713094.html

文章指出在云函数中,回调时别使用success, fail, complete,用这种写法执行时会没有任何反应。应该用Promise风格的写法来代替,即数据库操作完毕后,用then()。

这样我就明白是格式不对,而不是代码的逻辑不正确。

 

错误例子

------------------------------------------------------------------

await db.collection('users').add({

  data: {

    a: "one",

    b: "two",

  },

  success(res) {

    fun1()

  },

})

------------------------------------------------------------------

正确例子

------------------------------------------------------------------

await db.collection('users').add({

  data: {

    a: "one",

    b: "two",

  },

}).then(res => {

  fun1()

})

------------------------------------------------------------------

 

第三组是网上关于Promise.all()的文档。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

Promise.all(iterable) 方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中  promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

这让我明白了Promise.all( )的一般操作模式:

Promise.all( ).then(function(values) {  console.log(values);});

结合《async函数的返回值》https://blog.csdn.net/congnandaobei/article/details/93627724这篇文章,我终于弄明白async function,const data = await 这些天书般的东西与Promise之间的关系。

廖雪峰的博客:JS Promise 教程https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544这篇文章把JS的Promise讲得比较透彻了。

有一个相关的是官方文档那个用云函数分批次取超出100条数据的代码片段。

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/read.html

------------------------------------------------------------------

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,

    }

  })

}

------------------------------------------------------------------

其中出现了promise 这个字眼。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值