云函数的导出格式中,默认是加async的,也就是说我们可以通过await来控制导出过程中的流程,即云函数中命令的执行顺序。
'use strict';
exports.main = async (event, context) => {
const db = uniCloud.database();
const mdb = db.collection('test')
// let arr = [
// {
// title: "zhansan",
// herf: "www.baidu.com"
// },
// {
// title: "李四",
// herf: "m.douban.com"
// }
// ]
// mdb.add(arr)
let res = await mdb.field({'herf':true}).get()
return res.data //如果上面没加await,则return的是空值
};
一般来说,凡是在对于数据库的请求都需要加上await,这样做是为了再返回数据之前保证对数据库的访问已经完成,保证有数据能够返回。
包括get,add,update,remove等方法都需在前加上await来等待数据库的返回值,以确保进程的执行顺序。
举例:
在上面的云函数中,对数据库的get请求,如果没有加await,则return的res.data是一个空值,返回空值错误信息。
原因:没有await,进程同步执行,在let res = mdb.field({‘herf’:true}).get()这一步,数据库可能还没有返回数据的时候,就会继续执行下一步的return,而不会等待res被赋值,即在res被赋值的那一刻,数据还没有请求完成,所以res被赋了空。
如果添加await,async函数中,当执行到await时会让出进程,先执行async外的同步代码,再返回到await处等待表达式的返回值,然后由于云函数中async外没有任何代码,则就表现为await直接等待表达式的返回值,即等待数据库的返回值,这样由于await,res会等到数据库请求完成后再被赋值,这样res就不会为空了。
所以:在async函数中如果没有await,则该函数没有异步特性,仍然按照同步代码的顺序执行,而一旦有await,则async表现出异步性,让出当前进程优先执行async外的同步代码,并把await后续的所有代码(不包括await等待的表达式本身)加入微任务队列,等到外面的同步代码执行完毕后,返回await处等待表达式的返回值,最后再依次执行微任务和宏任务。