收藏
回答

如何根据云数据库的查询结果修改本地js函数的变量?

这是我在一个页面对应的js文件里写的一个函数,预期实现的效果是:

用户在页面点击按钮,执行绑定的initClassNum()。这个函数的逻辑是先调用creatClassNum()生成随机数,再通过查询判断该随机数有没有和云数据库里的重合,重合了的话就再调用creatClassNum(),并再进行判断,直到生成的随机数与云数据库中的不重合为止。最后把该num赋值给页面里的classNumber。

  initClassNum: function(){

    var num = '';

    var result_length = -1;   // 查询结果的数组长度,为0表示班级码可以使用,大于0表示重复了

    let that = this;

    do{

      // 生成班级码

      num = this.creatClassNum();

      console.log('生成的班级码', num)

      // 检查该班级码是否已经存在于云数据库

      const db = wx.cloud.database();

      db.collection('class').where({

        number: num

      }).get()

      .then(res =>{

        console.log('数据库匹配结果', res.data.length)

        result_length = res.data.length

      })

      .catch(err=>{

        console.error(err)

      })

    }while(result_length != 0);

    // 将班级码放入页面数据

    that.setData({

      classNumber: num

    })

},

但实际执行过程中我发现循环不会停止......通过console.log(result_length),我发现原因在于result_length = res.data.length并不能更改整个函数里result_length的值,所以result_length一直为-1,循环也一直不会停。。。。。。

请问是什么原因造成的呢?是因为云数据库查询是异步操作的原因吗?还是因为var变量的作用域。。。?

更改的话我又应该改成什么样呢?百思不得其解。。。。


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

3 个回答

  • LIANG
    LIANG
    2022-04-25

    用GUID,应该就不用考虑是否重复了吧

    2022-04-25
    有用
    回复 1
    • 七世之光
      七世之光
      2022-04-25
      您说的有道理。但我主要好奇我逻辑错在哪儿了...不搞清楚的话我感觉后面也不好继续写TAT
      2022-04-25
      回复
  • dreamhunter
    dreamhunter
    2022-04-25

    异步问题,while 内容写在 then 里面

    2022-04-25
    有用
    回复 1
    • 七世之光
      七世之光
      2022-04-25
      好的谢谢,我再试一下
      2022-04-25
      回复
  • 眼镜
    眼镜
    发表于移动端
    2022-04-25
    jinibj ui*数
    2022-04-25
    有用
    回复
登录 后发表内容