最近在搞小程序,采用的是微信云开发云函数作为后端,云函数是nodejs开发,但是因为不是很会nodejs,导致遇到一个印象深刻的bug与知识点,在此记录下来。
知识点比较浅显,大佬看了的话见笑了,这里更多是做个笔记

2.需求举例

集合中有category与items,如下
category
在这里插入图片描述
items
在这里插入图片描述
需要通过用户输入的cname字段找出属于此类的项,如上:通过用户输入的美食找出宫保鸡丁、回锅肉、鱼香肉丝返回给前端。

3.错误例子

前端
index.wxml

<view class="btnview">
  <button type="primary" bindtap="callFunc">获取美食类别下的美食</button>
</view>

index.js

Page({
  callFunc:function(){
    wx.cloud.callFunction({
      name: 'quickstartFunctions',
      data: {
        type: 'index/index',
        cname:'美食'
    }).then((res) => {
      console.log(res)
const cloud = require('wx-server-sdk');
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
exports.main = async (event, context) => {
  var cname = event.cname;
  return await db.collection('category').where({
    cname:cname
  }).get().then(res=>{
    console.log(res)
    db.collection('items').where({
      cid:res.data[0]._id
    }).get().then(res=>{
      console.log(res)
      return res // 返回查找所属cname的项
    });
  });

云函数:
在这里插入图片描述
前端:
在这里插入图片描述
通过前端的输出发现,虽然云函数查找到了所属美食的项并且写了return这查找的列表代码,但是前端输出的确实undefined,经过排查,发现是云函数的代码问题

4.分析错误

db.collection…查询数据库是异步操作,虽然如上代码云函数前有return await,但是这里是两个db操作,发生了两次异步,而只await了一次
在这里插入图片描述
await只会等待红色框的异步操作,而青色框内的异步操作则不会等待,程序运行到青色的db时会跳过直接运行接下来的代码,而接下来没有代码了,所以会直接返回,而不会等待青色框内的异步return结果,所以前端得到的结果是undefined

5.尝试解决方法

既然不会等待青色框的异步,那么我想着在db前加上await,结果是代码编译报错,这样的写法是错误的
在这里插入图片描述

6.解决方法、代码及结果

  1. 解决方法,在CSDN网站搜索相关知识点后,得知await只能在声明了async的function中才有效,那么只好用function封装一下或者在then的作用域内用async声明才可以使用await
  2. 代码
    方式一:另写一个function
const cloud = require('wx-server-sdk');
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
exports.main = async (event, context) => {
  var cname = event.cname;
  return await 
  db.collection('category').where({
    cname:cname
  }).get().then(res=>{
    console.log(res)
    return getItems(res)
  });
// await 只能用在声明了async的函数中
async function getItems(res){
  return await db.collection('items').where({
    cid:res.data[0]._id
  }).get().then(res=>{
    console.log(res)
    return res // 返回查找所属cname的项
  });

方式二:在then的作用域内用async声明

const cloud = require('wx-server-sdk');
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
});
const db = cloud.database();
1.通过 cname参数查询category集合中的cid
2.再通过获取的cid查询items下属于该类别的项
3.返回获取该类别的项
exports.main = async (event, context) => {
  var cname = event.cname;
  return await 
  db.collection('category').where({
    cname:cname
  }).get().then(async(res)=>{ // 声明async
    console.log(res)
    // 这样写法,代码较紧凑和乱
    return await db.collection('items').where({
	    cid:res.data[0]._id
	  }).get().then(res=>{
	    console.log(res)
	    return res // 返回查找所属cname的项
	  });
  });

3.这样写后,前端能得到正确数据了
在这里插入图片描述

  1. 这是我个人的写法,可能不太正确,如果有更好的方法欢迎指导
  2. 简单的笔记
    个人认为
    声明了async的function,在里面可以执行同步或异步代码,异步代码可以用await变成同步代码.
    await只能使用在async声明的函数里,不能使用在普通函数里。

参考BLOG链接:CSDNBLog:async、await个人使用理解

文章目录1.引入2.需求举例3.错误例子4.分析错误5.尝试解决方法6.解决方法、代码及结果6.后记1.引入最近在搞小程序,采用的是微信云开发云函数作为后端,云函数是nodejs开发,但是因为不是很会nodejs,导致遇到一个印象深刻的bug与知识点,在此记录下来。知识点比较浅显,大佬看了的话见笑了,这里更多是做个笔记2.需求举例集合中有category与items,如下categoryitems需要通过用户输入的cname字段找出属于此类的项,如上:通过用户输入的美食找出宫保鸡丁、回 由于没有正式上线使用,仅作为demo使用,所以请移步csdn预览动图: 满汉子全席——点餐小程序 本小弟参加实训使用微信开发者工具写的点餐小程序项目,同时使用nodejs编写后台部分来操作数据库,和我一样初学小程序nodejs的可以在本项目中学习了解关于小程序代码结构组织,模块化,构建等内容,入门小程序nodejs的好选择。 技术栈及工具 工具:微信开发者工具 vscode mysql 前端: html + css + js + 小程序api + weui 后台: nodejs + express框架 + mysql数据库 star and fork本项目 安装node环境 git clone (本项目地址) 前端小程序页面打开步骤: 使用微信开发者工具导入 mhzqx小程序文件夹
小程序数据操作异步的。函数执行数据操作往往在数据操作还未执行完成就返回了,对于数据库的执行状态判断十分不足。如下面这种情况: 我的目的是为了判断用户是否注册登录的。写在函数中是为了方便获取openid // 函数入口文件 const cloud = require('wx-server-sdk'); // 初始化 cloud cloud.init({ // API 调用都保持和函数当前所在环境一致 env: cloud.DYNAMIC_CURRENT_ENV const
小程序开发中经常遇到后一个操作依赖前一个操作异步执行结果的情形。虽然JavaScript是单线程语言,但是主线程中的耗时操作通常都被放入任务队列中异步执行,避免阻塞主线程,例如: let f1 = function (sequence) { console.log("f1开始执行"); setTimeout(function () { console.log("f1执行完成"); },10) let f2 = function (sequence) { conso exports.main = async (event, context) => { //获取表 let table = cloud.database().collection('table'); //查询表 //由于考虑到异步调用,需要用await返回结果给res //否则可能res没有获得值就传给了处理函数 let res = await table.
JS中的同步与异步 个人笔记,欢迎友好交流讨论。关于同步、异步、微任务、宏任务、事件轮询、如何实现异步编程,内容较多,目前只学习了一小部分,继续gogogo!!! 单线程与多线程 JS是一门单线程的语言。单线程:如果在同一时间有多个任务,这些任务就需要排队执行,前一个任务执行完,才会执行下一个任务。 为什么 JS 是单线程的语言? JS 是浏览器的脚本语言,主要用于实现和用户的交互。 前端主要使用 JS 实现对 DOM 的各种各样的操作,如果 JS 是多线程的语言, 那么一个线程 要对一个DOM节点
Unity打包WebGL报Unable to parse Build/*.framework.js.gz This can happen if build compression was....... 15112