收藏
回答

小程序调用云数据库,获取数据库某数据值,赋给全局变量,为何函数体外第一次全局变量并未取到数据库的值?

问题

微信小程序调用云数据库,试图获取数据库某数据的值,并赋给全局变量,测试中函数体内该全局变量是有拿到对应值,但是函数体外第一次全局变量并未取到数据库的值,第一次以后才可取到数据库的值。怎么实现第一次就能拿到数据库的值

源码

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总能拿到云数据库的对应数据的值,但是在函数体外,同一台手机扫描时,第一次总是拿不到值,第二次以及之后才能够成功被赋值为云数据库指定值。

希望代码实现任意扫描次数都能够拿到指定的值。

这个问题困扰了我几天了,一直没找到解法,发帖向各位大佬求助。


回答关注问题邀请回答
收藏

3 个回答

  • Mr.Zhao
    Mr.Zhao
    2020-04-23

    异步的问题 async await 同步执行了解一下

    2020-04-23
    有用 1
    回复 14
    • Jeremy
      Jeremy
      发表于移动端
      2020-04-24
      那么应该加到哪里呢?
      2020-04-24
      回复
    • Mr.Zhao
      Mr.Zhao
      2020-04-24回复Jeremy
      你试试,开启增强编译
      2020-04-24
      回复
    • Jeremy
      Jeremy
      发表于移动端
      2020-04-24回复Mr.Zhao
      嗯嗯,我之前试的方法把await加在了scan_time的赋值中,晚上回去我再试试您的方法。感谢感谢。试完后给大家报备一下结果,供大家参考。
      2020-04-24
      回复
    • Jeremy
      Jeremy
      2020-04-24
      大佬,刚用您的代码测试了一下,有报错VM296:1 Uncaught (in promise) thirdScriptError
      Cannot read property 'result' of undefined
      TypeError: Cannot read property 'result' of undefined
      参考论坛,试着console.log(res)了一下
      图中代码所示,最终只能打印res1。
      请问这个是什么问题,网上查了一下,好像跟npm有关。萌新,想请教一下应该怎么解决这个问题?
      2020-04-24
      回复
    • Jeremy
      Jeremy
      2020-04-24回复Jeremy
      2020-04-24
      回复
    查看更多(9)
  • Jeremy
    Jeremy
    2020-04-24
    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,
     })
     },
    
    
    
    
     })
     },
    
    
    
    2020-04-24
    有用
    回复
  • 郑旭东
    郑旭东
    2020-04-24

    是啊,异步问题,那就放在里面赋值呗,不要拿出来赋值。

    2020-04-24
    有用
    回复 1
    • Jeremy
      Jeremy
      发表于移动端
      2020-04-24
      请问源码怎么改啊?我这边加async和await会报错。
      2020-04-24
      回复
登录 后发表内容
问题标签