微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端
文章目录
- 1.引入
- 2.需求举例
- 3.错误例子
- 4.分析错误
- 5.尝试解决方法
- 6.解决方法、代码及结果
- 6.后记
1.引入
最近在搞小程序,采用的是微信云开发云函数作为后端,云函数是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.解决方法、代码及结果
- 解决方法,在CSDN网站搜索相关知识点后,得知await只能在声明了async的function中才有效,那么只好用function封装一下或者在then的作用域内用async声明才可以使用await
- 代码
方式一:另写一个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)=>{ // 声明asyncconsole.log(res)// 这样写法,代码较紧凑和乱return await db.collection('items').where({cid:res.data[0]._id}).get().then(res=>{console.log(res)return res // 返回查找所属cname的项});});
};
3.这样写后,前端能得到正确数据了
6.后记
- 这是我个人的写法,可能不太正确,如果有更好的方法欢迎指导
- 简单的笔记
个人认为
声明了async的function,在里面可以执行同步或异步代码,异步代码可以用await变成同步代码.
await只能使用在async声明的函数里,不能使用在普通函数里。
参考BLOG链接:CSDNBLog:async、await个人使用理解
微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端相关推荐
- 微信小程序云函数操作云数据库Mysql
微信小程序云函数操作云数据库Mysql 参考一 参考二 云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写.一键上传部署即可运行后端代码. 小程序内提供了专门用于云函数调用的 API.开发 ...
- 微信小程序云函数构建npm,找不到node_modules以及后续出现上传所有文件,并没有上传node_modules的文件问题
最近研究下微信小程序云函数,在构建npm的时候困扰了很久,总是提示找逼到node_modules,之前一直也没接触过nodejs,不想购买服务器,选择尝试下云开发. 出现这个错误在网上找了很多,都没找 ...
- 微信小程序云函数服务器,微信小程序云函数使用的几点说明
微信小程序云函数是一个好东西,相当于微信为我们提供了一个可以跑node.js的服务器,并且可以外部通过API的方式调用云函数,不过微信的文档一向写的不明不白,初学的时候踩了不少坑,在这里记录下来. 1 ...
- 微信小程序云函数使用教程【超详细】
背景需求 在本人的项目中,需要调用一个http的接口,而微信小程序所有的网络请求都得使用https,因而需要一个中转站,使得在正式发布的时候可以使用http接口.(在调试环境下,只要在本地设置里勾选& ...
- 微信小程序云函数中的数据处理后返回
微信小程序云函数中的数据处理后返回 本文主要演示的是,在微信云函数中调用数据库后,如何对获取的内容在云函数内处理后返回. 主函数 exports.main = async (event, contex ...
- 微信小程序云函数--数据库集合使用
微信小程序云函数--数据库集合使用 1.首先,准备和配置好云函数的路径和文件信息 参考我的上一篇:https://blog.csdn.net/u010326875/article/details/10 ...
- 微信小程序云函数开发环境 node.js的安装参考
微信小程序云函数开发环境 node.js的安装参考 下载:nvm-windows 下载下图安装包,地址在: https://github.com/coreybutler/nvm-windows/rel ...
- 微信小程序云函数传递数组_微信小程序云开发一周入门
作为一个程序员,一直想自己做一款程序,无奈工作以来一直做的是数据处理的工作.数据库用的挺溜,但前端就两眼一抹黑了.早在微信小程序刚出来的时候,就关注过,但考虑到前端后端的种种因素,一直没太做深入的了解 ...
- 微信小程序云函数获取近七天或近一个月的数据,使用云开发已修复时区的问题
使用了云开发的微信小程序,就不能方便地用mysql的to_days函数处理,获取关于时间的数据 思路: 查询微信小程序文档后考虑使用聚合操作 不可能只是去获取一个固定时间,而是一个区间的时间段 Com ...
最新文章
- 操作系统学习笔记 第六章:设备管理(王道考研)
- 网页、网站规划与设计1
- php java memcached_php和java的memcached使用的兼容性问题解决过程
- 设计模板类,使得在创建一个对象时可以动态确定它的基类(public)
- python初学者视频-python从入门到精通视频(全60集)
- spark集群测试小案例
- 深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用
- Linux-Ubuntu部署Springboot项目应用到生产环境(jar方式)
- python银行家算法_Linux 死锁概念与银行家算法python 实现
- 在10万以内判断,一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数,求该数...
- 打造Vim作为前端IDE
- vue中的watch监听
- QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
- python九宫格拼图游戏
- 【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第四章
- 46相关度评分TFIDF算法
- 困扰了已久的TCP/IP 协议,终于有人讲的明明白白,太强了
- 扫码进入微信小程序使用WIFI进行UDP通信发送消息
- JVM StackOverFlowError
- html和word相互转换