收藏
回答

云函数中异步相关问题?

云函数版本: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 (中国标准时间)


按文档描述,云函数并不是执行完就立马销毁,似乎云函数内可以执行一些短期的异步任务?


回答关注问题邀请回答
收藏

2 个回答

  • showms
    showms
    2023-11-13

    本地调试的跟云端执行的不一样,云端是云函数一返回,异步任务就结束了

    2023-11-13
    有用
    回复
  • 吴
    2023-11-12

    https://docs.cloudbase.net/cloud-function/deep-principle

    第一点意思是main return之后进程就会冻结,异步任务可能不会执行;

    第二点可以接受,相当于进程重启

    第三点意思是不是用node.js 10及以上版本就不会出现第一点的问题?

    2023-11-12
    有用
    回复 1
    • 吴
      2023-11-21
      亲测有效,Nodejs16.13 云端环境。
      客户端请求云函数,先收到主函数返回的true,3秒后收到了通知
      2023-11-21
      1
      回复
登录 后发表内容