6***@qq.com
6***@qq.com
  • 发布:2022-05-12 20:16
  • 更新:2022-05-22 11:34
  • 阅读:395

请问云函数为什么无法阻塞查询数据库

分类:uniCloud

问题困扰了我很久,始终会先返回return的值,再打印console的内容,求教大神指导,非常感谢

2022-05-12 20:16 负责人:无 分享
已邀请:
6***@qq.com

6***@qq.com (作者)

会导致上传到服务器上,先执行return,直接结束程序流程,无法运行数据库查询,求大神指导如何解决,非常闹心

  • DCloud_uniCloud_WYQ

    云端环境不支持云函数结束后继续运行,你上面如果是个for循环的话,可以考虑使用promise.all并发执行,如果并发量大可以考虑使用三方库限制并发度

    2022-05-13 14:59

  • 6***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 不好意思,初学不是很懂,搜索也找不到解决办法,底下我贴了代码,麻烦您指导一下哈,非常感谢

    2022-05-21 10:26

呆狗的一生

呆狗的一生 - 呆狗的一生

把整个方法贴出来不行吗?

  • 6***@qq.com (作者)

    不好意思,初学不是很懂,搜索也找不到解决办法,底下我贴了代码,麻烦您指导一下哈,非常感谢

    2022-05-21 10:26

DCloud_heavensoft

DCloud_heavensoft

await就是异步啊

  • 6***@qq.com (作者)

    不好意思,初学不是很懂,搜索也找不到解决办法,底下我贴了代码,麻烦您指导一下哈,非常感谢

    2022-05-21 10:26

6***@qq.com

6***@qq.com (作者)


'use strict';  
exports.main = async (event, context) => {  
    //event为客户端上传的参数  

    const db = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传  
        event,  
        context  
    })  
    const dbCmd = db.command  
    // const upData = event.queryStringParameters //url地址化无法直接获取参数?  
    const upData = event  
    console.log('event : ', event)  

    if(upData.code) {  
        //查询兑换码  
        let res = await db.collection('lifuquan').where({  
            code: String(upData.code)  
        }).limit(1).get()  
        console.log(res)  

    }  
    //想先数据库查询,再返回查询数据给客户端,请问如何解决  
    return event  
};  
  • 6***@qq.com (作者)

    总是先return 再执行查询,云服务器会直接因return而中断查询,搞不懂如何解决

    2022-05-21 10:27

  • DCloud_uniCloud_WYQ

    回复 6***@qq.com: 这个应该是日志顺序的问题,实际执行顺序是正常的,你可以打印时间戳来确认一下,后续会优化此问题

    2022-05-23 14:00

  • 6***@qq.com (作者)

    回复 DCloud_uniCloud_WYQ: 确认过不是日志顺序,实际放到云服务器执行也是这样,没有执行完毕就return数据直接中断了

    2022-05-25 23:59

  • DCloud_uniCloud_WYQ

    回复 6***@qq.com: 你确定在云端执行的上面的代码吗?方便我远程看一下吗?我QQ 2292434668

    2022-05-26 14:48

呆狗的一生

呆狗的一生 - 呆狗的一生

测试后发现,的确存在你说的情况,但这不是bug,可以说是uniCloud云函数的一个【智能】的行为,因为你返回的只是event对象,你的返回结果并没有与异步查询有任何联系,所以先输出了结果。你如果输出的是res,那么【执行结果】将是在最后输出。你的理解也并没有错。这个问题不必去深究!

Ae丶腾

Ae丶腾

'use strict';
const pAll = require('p-all');
exports.main = async (event, context) => {
const dbJQL = uniCloud.databaseForJQL({event, context}), obj = {}

const yifus = await dbJQL.collection('yifus').where(`ok==${false}`).field('jdh,multiply(cs, size(gjs)) as sl').get()  
const jdhs = yifus.data.map(e => e.jdh)  
const logs = await dbJQL.collection('logs').where(`name!='xxx' && jdh in ${JSON.stringify(jdhs)}`).groupBy('jdh').groupField('sum(sl) as sl').get()  
logs.data.forEach(e => obj[e.jdh] = e.sl)  

let start = Date.now()  
const actions = yifus.data.map(({_id, jdh, sl}) => {  
    let jd = (100*obj[jdh]/sl || 0).toFixed(1),  
        ws = obj[jdh] || 0,  
        ok = ~~jd == 100  
        return () => dbJQL.collection('yifus').doc(_id).update({jd, ws, ok})  
})  
await pAll(actions)  
return Date.now() - start  

};

Ae丶腾

Ae丶腾

我上面的代码就可以,你自己看看,多线程并发操作,操作完毕才返回

该问题目前已经被锁定, 无法添加新回复