请教一个关于 数据库操作函数 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种实现方式,主要问题在哪里,应该怎样正确实现同步?
项目配置如下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你必须先搞懂
async await
是什么,并不是函数前面加上await
关键字就万事大吉了。你让它
await
,你至少得让解释器知道,它是在wait
什么?什么时候执行下一步代码,看看你的fun456,你让它wait
什么了?它并没有要wait
的东西啊,当然同步返回了!看你代码中
db
本身就返回一个Promise
,完全没必要重新封装,不出意外按上面这样改一下就能有效果了建议先去看看理解promise,async/await的相关的内容,func456不返回promise,那跟普通的不带await调用就没啥区别了