- 请教一个关于 数据库操作函数 await promise同步的问题?
请教一个关于数据库操作进行同步问题。 问题的背景是要作一系列用户登陆操作,希望能达到根据用户 openID检索用户数据库,有则用库中的用户个人信息初始化接下来的函数,没有则要填入一个基本信息字段后,新增这个用户。 很显然这里的数据库访问 get 跟 新增 add等都是属于异步函数,要进行同步,尤其是新增用户,要选录入一个 信息,再做数据库 add 我个人的习惯是先做一个小demo,将同步机制完成后,再并入 实际的程序中。 然而读了几天官方手册,也看了不少网上的贴子,尝试了3种方式,进行同步,都没能实再想要的效果。 恳请过路的高人前辈帮忙瞅一瞅,应该怎样解决同步的问题。 先上demo中 index.js的代码 //index.js const regeneratorRuntime = require("../../libs/regeneratorRuntime.js"); const promisify = require('../../libs/promisify.js'); const app = getApp(); const db = wx.cloud.database(); Page({ data: { grade: 0, innerData: 0 }, onLoad: function () { let that = this; console.log('initical data', that.data.innerData); // const awfun4 = promisify(that.fun4()); // const awfun5 = promisify(that.fun5()); // const awfun6 = promisify(that.fun6()); that.orderTest(); // console.log(awfun4); // console.log(awfun5); // console.log(awfun6); }, orderTest: async function () { let that = this; await that.fun4(); console.log('after fun1', that.data.innerData); await that.fun5(); console.log('after fun2', that.data.innerData); await that.fun6(); console.log('after fun3', athat.data.innerData); await that.fun4(); console.log('after fun1', that.data.innerData); await that.fun5(); console.log('after fun2', that.data.innerData); await that.fun6(); console.log('after fun3', that.data.innerData); await that.fun4(); console.log('after fun1', that.data.innerData); await that.fun5(); console.log('after fun2', that.data.innerData); await that.fun6(); console.log('after fun3', that.data.innerData); }, fun1: function () { let that = this; that.data.innerData = that.data.innerData + 1; console.log('in fun1, innerData', that.data.innerData); return 0; }, fun2: function () { let that = this; that.data.innerData = that.data.innerData + 2; that.data.grade = 4; console.log('in fun2, innerData', that.data.innerData); return 0; }, fun3: function () { let that = this; that.data.innerData = that.data.innerData + 3; console.log('in fun3, innerData', that.data.innerData); return 0; }, fun4: function () { let that = this; // return new Promise((resolve, reject) => { db.collection('rank').where({ uid: "asdfaf" }).get().then((res) => { //success: res => { that.fun1(); //}, fail: err => { //that.fun1(); //} }); //return promise; }, fun5: function () { let that = this; db.collection('rank').where({ uid: "asdfaf" }).get().then((res) => { that.fun2(); }); return 0; }, fun6: function () { let that = this; db.collection('rank').where({ uid: "asdfaf" }).get().then((res) => { that.fun3(); }); }, }) 简单做一下解释,有三个基本的同步函数 fun1, fun2, fun3里边操作一个变量 innerData 作自增, 因为是要做异步操作的同步,所以在 fun4, fun5, fun6中分别加入一段带 where条件的数据库访问函数,如果成功则调用刚才fun1, fun2, fun3。 为了进行同步判断,在调用一列系待同步函数 fun4,fun5,fun5中,console.log打印出 当前的做测试的 innerData,跟函数名称, 在调用 fun4,fun5,fun6后也打印 innerData跟函数名,判断是否正确同步。 事实的输出结果有两处跟预期不相符。 第1是 主程序中所有的console.log是一齐打到终端的,并且,值也是 innerData的初始值,没有被fun1,fun2, fun3操作自增, 是不是console.log本身也是异步的,网上看了一贴子不是太理解,个人理解贴子表达的意思是不是说跟缓存有关? 第2个更关键的是,我用了网上能查到的 3种方式,尝试同步 带数据库操作的 fun4,fun5,fun6,但都没有能正确实再 顺序同步。 分别是 1、主程序 async,fun4,fun5,fun6前加await 2、使用promise方法,封装生成一个 promise对象 3、import第3方promisify库,封装fun4,fun5,fun6代码 都没能达到预期效果,输出始终不同步 [图片] 请问我的3种实现方式,主要问题在哪里,应该怎样正确实现同步? 项目配置如下 [图片]
2020-05-03 - 小程序云函数查询数据 排序orderBy 跟 limit均不生效,只是返回表中所有记录?
想实现一个 对 用户积分表,进行查询后筛选排序前4条记录,官方文档中似乎是说 单在小程序端不提供 排序功能,故放在 云函数中进行查询、 排序,并取 前4条符合条件的记录。 数据表设计如下,grade 字段为 number类型,表示年级,具体实现中,是打算查询 1年级中 积分 前4名的 积分记录。 [图片] 云函数查询代码如下,使用了官方手册中能查到的两种方式查询,均不能成功筛选,代码如下 // 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init(); const db = cloud.database(); const $ = db.command.aggregate // 云函数入口函数 exports.main = async (event, context) => { try{ //let rank = // await db.collection('rank') // .where({ // grade: 1 // }) // .get({ // success: (res) => { // console.log(res.data); // } // }) return db.collection('rank') .aggregate() .match({ grade: 1 }) .sort({ point: -1 }) .limit(4) .end() } catch (error) { return error; } // return rank; // let rank = await db.collection('rank').aggregate() // .match({ // grade: 1 // }) // .sort({ // point: -1, // }) // .limit(4) // .end(); //console.log(rank); } 疑惑的是,用 where 语句进行筛选时,成功返回了2次,那2次返回值均按 point字段进行了排序,并且 只返回 4条记录。 然而 在后续的编码测试中,两种方式都不能按要求返回 4条记录,也没有 按 point进行排序, 为方便排查原因,已经 将 grade 字段直接 匹配数字1,以排除传参问题。 [图片] 小程序端调用代码如下 [图片] 请问如何正确的实再 上述功能,查询 并返回 指定表 某字段 排序 后的前4条记录,我前面的代码没能实现功能,具体问题出在哪里?
2020-04-23 - 小程序能否在 数据库查询时,在 success 中同时嵌套 更新update 或 新增add操作?
有一个应用要统计要对 用户记录实现 积分更新,如果是 新用户积分表中没有该用户记录则需新增。 能否实现按用户名 where查询,如果 get 后 seccess,则对该用户的相应积分查行更新。 若查询不到该用户名的记录,则直接新建一条 该用户的积分记录。 若 小程序的 collect 的 get方法不能直接 嵌套 对同一数据表 实现更新 和 新增记录的操作。 那么小程中,较为合理的实现流程应怎样处理,能否提供 伪算法。 我目前的算法里,为解决异步问题,在 页首的 data中放入一个标记量表示 该用户是否存在, 第1步先根据用户名,做一次查询,设置用户是否存在标记量 第2步如果用户存在,则要再访问一次数库,进行 更新用户记录,若用户不存在则 新建用户记录。 这样实现须要进行 2次数据库访问,请问我目前的这种操作是否 必须,能否改进? [图片]
2020-04-22 - 怎样判断input 控件中没有输入内容,内容为 空?
有一段算法需要验证 input控件中内容是否为空, [图片] 按上图将控件与一数值绑定,但是在用下图中方法判定 input中是否有内容输入,无论使用 == 或===比对,控件内容均显示为 空。 [图片] console.log(that.data.ans0)也不能打印出任何值。 怎样处理,才能正确判断出 input中内容是否为空?
2020-04-18 - 空项目报错,调试基础库 2.10.4报错,改用 2.10.3正常?
生成一个 不使用 云服务的空项目,加载后报错。 appServiceSDKScriptError Cannot read property 'operationInfo' of undefined;at wxConfig.onReady callback TypeError: Cannot read property 'operationInfo' of undefined 改用低版本 调试库正常 [图片]
2020-04-04 - 中午把 json 文件导入到云数据库,数据异常?
使用 小程序开发工具 集成开发环境 中的 云开发 按钮 呼出的窗口导入,期间没有任何报错,但是导入的数据一直不正常,入库后的数据再导出,前后比对明显不一致,是之前一个老版本的 json中的数据,Insert 跟 Upsert两种方式都尝试过,求解
2020-04-03 - 父级View中怎样绑定事件判断里面的子控件全部失去焦点?
我最近在做一个分数运算的应用,要验证最后的算得的分数值是否正确,最终的答案可能是只有 整数部分,也可能只有分数部分(真分数),也可能两者同时存在(带分数)。 我在具体的 wxml的设计时,是将整个答题结果的整数和分数部分 包在一个 view容器中,对应的整数、分数部分,使用 input控件放在 view中。 [图片] 因为整数或分数部分并不一定会始终存在,因此必须对同一个答案的 整体输入完成后进行验证。 我试图在 包了 三个 input的view控件中,采用 bindblur 失去焦点进行事件绑定,判断,view中的三个input全部输入数值完成,但没有达到效果,事件不响应,请问应该怎样处理,才能达到在最外层 view中判断 里面3个input都已失去焦点,并同时获取 3个input中的数据,进行数值判断验证? <view class="in-answer-fs" bindblur="onVwBlurFra0"> <input class="in-answer-zs" /> <view class="in-answer-fsbufen"> <input class="in-answer-fz" /> <input class="in-answer-fm" /> </view> </view>
2020-03-25