云函数版本:Nodejs16.13
环境:生产
//伪代码
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database();
exports.main = async (event, context) => {
//并行
const task1 = db.collection('xx').xx.get()
const task2 = db.collection('xxx').xx.get()
const data1 = (await task1).data;
const data2 = (await task2).data;
//...
//异步执行
db.collection('xx').where(..).update(..);
db.collection('xxx').where(..).update(..);
return { success: true }
}
偶然发现上述代码中两个update没有await等待,结果也正常执行。继续改造测试(云函数本地调试):
//伪代码
exports.main = async (event, context) => {
//...
//异步执行
backgroundTask();
console.log('return data ' + new Date())
return true
}
async function backgroundTask() {
console.log('sleep ' + new Date())
await new Promise(resolve => setTimeout(resolve, 5000))
console.log('done ' + new Date())
}
//云函数本地调试 Console
[info] 函数被触发,正在执行中...
cloudFunctionTest.js:97 sleep Sun Nov 12 2023 14:23:55 GMT+0800 (中国标准时间)
cloudFunctionTest.js:38 return data Sun Nov 12 2023 14:23:55 GMT+0800 (中国标准时间)
node.js:1 [info] 函数执行成功(耗时 366ms) true
node.js:1 [info] 调用 本地 云函数 'myFunctions' 完成 (耗时 370ms)
cloudFunctionTest.js:99 done Sun Nov 12 2023 14:24:00 GMT+0800 (中国标准时间)
按文档描述,云函数并不是执行完就立马销毁,似乎云函数内可以执行一些短期的异步任务?
本地调试的跟云端执行的不一样,云端是云函数一返回,异步任务就结束了
https://docs.cloudbase.net/cloud-function/deep-principle
第一点意思是main return之后进程就会冻结,异步任务可能不会执行;
第二点可以接受,相当于进程重启
第三点意思是不是用node.js 10及以上版本就不会出现第一点的问题?
客户端请求云函数,先收到主函数返回的true,3秒后收到了通知
exports.main = async (event, context) => {
//...
//异步执行
backgroundTask();
return true
}
async function backgroundTask() {
await new Promise(resolve => setTimeout(resolve, 3000))
cloud.openapi.subscribeMessage.send('微信通知');
}