官方给的一个较简单的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()
})
------------------------------------------------------------------
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 这个字眼。