小程序云函数解决异步调用的问题(如何等待异步调用完成再执行)

小程序的数据库操作是异步的。云函数中执行数据库操作往往在数据库操作还未执行完成就返回了,对于数据库的执行状态判断十分不足。如下面这种情况:

我的目的是为了判断用户是否注册登录的。写在云函数中是为了方便获取openid

// 云函数入口文件
const cloud = require('wx-server-sdk');
// 初始化 cloud
cloud.init({
  // API 调用都保持和云函数当前所在环境一致
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  let openid = wxContext.OPENID;
  let unionid = wxContext.UNIONID;
  let returncode = 100;
  db.collection("userinfoTable").where({
    userid:openid
  }).get().then(res =>{
    if(res.data.length==0){
      returncode = 200;
    }else if(res.data.length==1){
      returncode = 201;
    }else{
      returncode = 400;
    }
  });
  return {
  	openid,
    returncode
  }
};

这样做返回的结果中returncode是初始值100.因为在异步db未执行完成后数据库就已经返回了。
此时我们引入async/await的组合。使用如下模板:

const cloud = require('wx-server-sdk');
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
exports.main = async (event, context) => {
  return saveuserinfo();
};
// 创建异步函数并将代码放到异步函数里面执行。
async function saveuserinfo() {
  await db.collection("userinfoTable").where({
    userid:openid
  }).get().then(res =>{
	  ....
  });
  return {
	  ....
  }
};

// 云函数入口文件
const cloud = require('wx-server-sdk');
// 初始化 cloud
cloud.init({
  // API 调用都保持和云函数当前所在环境一致
  env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database();
// 云函数入口函数
exports.main = async (event, context) => {
  return saveuserinfo();
};
async function saveuserinfo() {
  const wxContext = cloud.getWXContext()
  let openid = wxContext.OPENID;
  let unionid = wxContext.UNIONID;
  let returncode = 100;
  await db.collection("userinfoTable").where({
    userid:openid
  }).get().then(res =>{
    if(res.data.length==0){
      returncode = 200;
    }else if(res.data.length==1){
      returncode = 201;
    }else{
      returncode = 400;
    }
  });
  return {
  	openid,
    returncode
  }
};

返回值如下。因为我的数据库中已经有相应的记录了。对应的就把returncode赋值为201了。
小程序云函数解决异步调用的问题(如何等待异步调用完成再执行)_第1张图片

写在最后:
[1] 我尝试了直接在main方法中使用await 这样会报错,不知道为何。
在这里插入图片描述
[2] 要注意云开发中数据库操作消耗时间比较久。使用await会严重影响时效性。可能会影响用户体验。

你可能感兴趣的:(笔记,javascript,node.js)