uni-app 云函数 异步任务不执行

uni-app 云函数 异步任务不执行

示例代码:

'use strict';  
exports.main = async (event, context) => {  
    let table = uniCloud.database().collection('test')  
    // 同步能执行  
    await table.add({test:"sync"})  
    // 异步没执行  
    table.add({test:"async"})  
    return {  
        code:200,  
        msg:'success'  
    }  
    // {file,event}  
};  

操作步骤:

  • 将代码粘贴到云函数,调用云函数

预期结果:

  • 数据表test添加{test:“sync”}和{test:“async”}两条数据

实际结果:

  • test表只添加{test:“sync”}1条数据
  • table.add({test:"async"})异步操作没执行

bug描述:

  • 在云函数中,异步任务不执行

更多关于uni-app 云函数 异步任务不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

在阿里云官方的函数计算中,可以配置preFreeze来解决这个bug
uniCloud有类似的解决方案么?

更多关于uni-app 云函数 异步任务不执行的实战教程也可以访问 https://www.itying.com/category-93-b0.html


没有,目前是函数返回后进程就会结束

同问,这个问题怎么解决?

官方没法解决,只能自己搞个任务队列之类的去消费

回复 1***@qq.com: 请问这个任务队列,是开一个定时任务的云函数吗,保持那个处理定时任务的队列实例一直不释放?

这是因为云函数执行环境在函数返回后会立即冻结,未完成的异步操作会被中断。当云函数返回 return 语句后,即使有未完成的异步任务,云函数容器也会立即终止执行。

在你的代码中:

  • await table.add({test:"sync"}) 是同步等待,会执行完成
  • table.add({test:"async"}) 是异步操作,在函数返回时还未执行完成就被中断了

解决方案:

  1. 等待所有异步操作完成
exports.main = async (event, context) => {  
    let table = uniCloud.database().collection('test')  
    await table.add({test:"sync"})  
    await table.add({test:"async"})  // 添加 await
    return {  
        code:200,  
        msg:'success'  
    }  
};
  1. 使用 Promise.all 并行执行
exports.main = async (event, context) => {  
    let table = uniCloud.database().collection('test')  
    await Promise.all([
        table.add({test:"sync"}),
        table.add({test:"async"})
    ])
    return {  
        code:200,  
        msg:'success'  
    }  
};
回到顶部