请教一个关于数据库操作进行同步问题。
问题的背景是要作一系列用户登陆操作,希望能达到根据用户 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种实现方式,主要问题在哪里,应该怎样正确实现同步?
项目配置如下