问题:
微信小程序调用云数据库,试图获取数据库某数据的值,并赋给全局变量,测试中函数体内该全局变量是有拿到对应值,但是函数体外第一次全局变量并未取到数据库的值,第一次以后才可取到数据库的值。怎么实现第一次就能拿到数据库的值
源码:
Page({
data: {
......//数据初始化
},
onLoad: function () {
console.log('onLoad')
},
click: function () {
wx.scanCode ({
success: res => {
var serial_num = res.result.substring(0, 16);
DB.get({
success(res){
console.log("查询数据成功", res);
for(var a = 0; a < 4; a++)
{
if(res.data[a].serial_no == serial_num)
{
DB.where({
serial_no:res.data[a].serial_no,
})
.update({
data: {
check_time: res.data[a].check_time + 1,
},
});
scan_times = res.data[a].check_time + 1;
console.log("Internal checked scan_times is ", scan_times);
console.log(res);
break;
}
}
}
})
console.log(scan_times);
scan_times = parseInt(scan_times) + 1;
console.log(scan_times);
}
this.setData({
})
wx.showToast({
title: '扫描成功',
icon: 'success',
duration: 2000
})
},
fail: (res) => {
wx.showToast({
title: '扫描失败',
icon: 'cancel',
duration: 2000
})
},
complete: (res) => {
}
})
},
}
)
存在问题:
调试下来,用手机扫描,在函数体内全局变量scan_times总能拿到云数据库的对应数据的值,但是在函数体外,同一台手机扫描时,第一次总是拿不到值,第二次以及之后才能够成功被赋值为云数据库指定值。
希望代码实现任意扫描次数都能够拿到指定的值。
这个问题困扰了我几天了,一直没找到解法,发帖向各位大佬求助。

异步的问题 async await 同步执行了解一下
click: function () {wx.scanCode({success: async res => {var serial_num = res.result.substring(0, 16);let res = await DB.get()console.log("查询数据成功", res);for (var a = 0; a < 4; a++) {if (res.data[a].serial_no == serial_num) {await DB.where({serial_no: res.data[a].serial_no,}).update({data: {check_time: res.data[a].check_time + 1,},});scan_times = res.data[a].check_time + 1;console.log("Internal checked scan_times is ", scan_times);console.log(res);break;}}console.log(scan_times);scan_times = parseInt(scan_times) + 1;console.log(scan_times);}})}Cannot read property 'result' of undefined
TypeError: Cannot read property 'result' of undefined
参考论坛,试着console.log(res)了一下
图中代码所示,最终只能打印res1。
请问这个是什么问题,网上查了一下,好像跟npm有关。萌新,想请教一下应该怎么解决这个问题?
click: function () { // var that = this; wx.scanCode ({ success: async res => { console.log("res1:", res); var serial_num = res.result.substring(0, 16); serial_no = serial_num; console.log("res2:", res); let res = await DB.get(); console.log("res3:", res); // await DB.get({ // success(res){ console.log("查询数据成功", res); for(var a = 0; a < 4; a++) { if(res.data[a].serial_no == serial_num) { console.log("test"); //查询次数+1 await DB.where({ serial_no:res.data[a].serial_no, }) .update({ data: { check_time: res.data[a].check_time + 1, }, }); scan_times = res.data[a].check_time + 1; console.log("Internal checked scan_times is ", scan_times); console.log(res); break; } } // } // }) console.log(scan_times); scan_times = parseInt(scan_times) + 1; this.setData({ scan_times: this.scan_times, }) }, }) },是啊,异步问题,那就放在里面赋值呗,不要拿出来赋值。