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

- 发布:2022-05-12 20:16
- 更新:2022-05-22 11:34
- 阅读:395

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 (作者)
回复 DCloud_uniCloud_WYQ: 确认过不是日志顺序,实际放到云服务器执行也是这样,没有执行完毕就return数据直接中断了
2022-05-25 23:59
-

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

'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
};
DCloud_uniCloud_WYQ
云端环境不支持云函数结束后继续运行,你上面如果是个for循环的话,可以考虑使用promise.all并发执行,如果并发量大可以考虑使用三方库限制并发度
2022-05-13 14:59
6***@qq.com (作者)
回复 DCloud_uniCloud_WYQ: 不好意思,初学不是很懂,搜索也找不到解决办法,底下我贴了代码,麻烦您指导一下哈,非常感谢
2022-05-21 10:26