云函数的导出格式中,默认是加async的,也就是说我们可以通过await来控制导出过程中的流程,即云函数中命令的执行顺序。

    1. 'use strict';
    2. exports.main = async (event, context) => {
    3. const db = uniCloud.database();
    4. const mdb = db.collection('test')
    5. // let arr = [
    6. // {
    7. // title: "zhansan",
    8. // herf: "www.baidu.com"
    9. // },
    10. // {
    11. // title: "李四",
    12. // herf: "m.douban.com"
    13. // }
    14. // ]
    15. // mdb.add(arr)
    16. let res = await mdb.field({'herf':true}).get()
    17. return res.data //如果上面没加await,则return的是空值
    18. };

    一般来说,凡是在对于数据库的请求都需要加上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处等待表达式的返回值,最后再依次执行微任务和宏任务。