收藏
回答

小程序中没有连表的功能吗?

问题模块 框架类型 问题类型 终端类型 AppID 基础库版本
云开发 小程序 需求 工具 wx10ad17f2835ccfbe 2.5.5

求大佬解答

小程序中没有连表的功能吗?

我一直是一个查询套一个查询,还有没有其他的方式?

for循环中进行数据库操作时,for结束数据没有返回,异步的问题,怎么搞成同步?

getDynamisInfo: function(dopenid, dynamicsId, _openid, i, r, q) { //获取点赞,关注,收藏,点赞数 //_openid说说的发表人 //dopenid 当前登录用户 db.collection('loves').where({ type: 1, //类型1是作品赞,2是评论赞 _openid: dopenid, //点赞者openid dynamicsid: dynamicsId, //作品id status: 1, //点赞状态 1点赞 0取消赞 //read:0,//作者已读状态 1已读,0未读 }).get().then((res1) => { r[i].loves_id = undefined; if (res1.data.length != 0) { //用户已点赞 r[i].loves_id = res1.data[0]._id; r[i].love_status = true; } else { //如果是[],就是说没有点赞 r[i].love_status = false; } //更新头像昵称,根据openid获取users表中的记录 db.collection('users').where({ _openid: _openid // 填入说说 openid }).get().then(res5 => { console.log(res5.data); r[i].avatarUrl = res5.data[0].avatarUrl; //头像更新 r[i].nickName = res5.data[0].nickName; //昵称更新 db.collection('loves').where({ type: 1, //类型1是作品赞,2是评论赞 dynamicsid: dynamicsId, //作品id status: 1, //点赞状态 1点赞 0取消赞 }).count().then(res2 => { r[i].love_number = res2.total; db.collection('collect').where({ _openid: dopenid, //点赞者openid dynamicsid: dynamicsId, //作品id status: 1, //点赞状态 1点赞 0取消赞 //read:0,//作者已读状态 1已读,0未读 }).get().then((res3) => { if (res3.data.length > 0) { r[i].collect_status = true; } else { r[i].collect_status = false; } db.collection('fans').where({ bFansOpenId: _openid, //说说的发表人 fansOpenId: dopenid // 填入当前用户 dopenid }).get().then(res4 => { r[i].fans_id = undefined; if (res4.data.length != 0) { //用户已点赞 r[i].fans_id = res4.data[0]._id; r[i].fans_status = true; } else { //如果是[],就是说没有点赞 r[i].fans_status = false; } console.log('更新状态'); if (r.length - 1 == i) { console.log('更新完毕'); wx.hideLoading(); // q = q.concat(r); this.setData({ //把所有变量清空 queryResult: q, zanArray: [], //赞了的,纯净的,点赞、取消一系列操作最后剩下的处于点赞状态的 allZan: [], //所有点过的赞,没去重 noZanArray: [], //取消赞的,需要更新数据的 loves id dynamicsid: [], //取消赞的,说说id,要减一 page: this.data.page + 1 //页数加1 }) } }) }) }) }) }) },
最后一次编辑于  02-07  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

3 个回答

  • Mr.Hope
    Mr.Hope
    02-08

    用promise重构一下?另外能否提供正式的代码片段?

    02-08
    赞同
    回复
  • 王寄锋
    王寄锋
    02-08
      getDynamisInfo: async function(dopenid, dynamicsId, _openid, i, r, q) {
        //获取点赞,关注,收藏,点赞数
        //_openid说说的发表人
        //dopenid 当前登录用户
        const a = await db.collection('loves').where({
          type: 1, //类型1是作品赞,2是评论赞
          _openid: dopenid, //点赞者openid
          dynamicsid: dynamicsId, //作品id
          status: 1, //点赞状态 1点赞 0取消赞
          //read:0,//作者已读状态 1已读,0未读
        }).get();
     
        //更新头像昵称,根据openid获取users表中的记录
        const b = await db.collection('users').where({
          _openid: _openid // 填入说说 openid
        }).get();
        const c = await db.collection('loves').where({
          type: 1, //类型1是作品赞,2是评论赞
          dynamicsid: dynamicsId, //作品id
          status: 1, //点赞状态 1点赞 0取消赞
        }).count();
        const d = await db.collection('collect').where({
          _openid: dopenid, //当前用户openid
          dynamicsid: dynamicsId, //作品id
          status: 1, //点赞状态 1点赞 0取消赞
          //read:0,//作者已读状态 1已读,0未读
        }).get();
        const e = await db.collection('fans').where({
          bFansOpenId: _openid, //被关注人openid
          fansOpenId: dopenid // 填入当前用户 dopenid
        }).get();
        console.log('更新中');
     
        console.log("点赞状态", a.data.length > 0);
        console.log("用户信息头像", b.data[0].avatarUrl);
        console.log("用户信息昵称", b.data[0].nickName);
        console.log("点赞数量", c.total);
        console.log("收藏状态", d.data.length > 0);
        console.log("关注状态", e.data.length > 0);
        if (a.data.length != 0) { //用户已点赞
          r[i].loves_id = a.data[0]._id;
          r[i].love_status = true;
        } else {
          //如果是[],就是说没有点赞
          r[i].love_status = false;
        }
        r[i].avatarUrl = b.data[0].avatarUrl; //头像更新
        r[i].nickName = b.data[0].nickName; //昵称更新
        r[i].love_number = c.total;
        if (d.data.length > 0) {
          r[i].collect_status = true;
        } else {
          r[i].collect_status = false;
        }
     
        r[i].fans_id = undefined;
        if (e.data.length != 0) { //用户已点赞
          r[i].fans_id = e.data[0]._id;
          r[i].fans_status = true;
        } else {
          //如果是[],就是说没有点赞
          r[i].fans_status = false;
        }
     
        if (r.length - 1 == i) {
          console.log('更新完毕');
          wx.hideLoading(); //
          console.log(r);
          q = q.concat(r);
          this.setData({
            //把所有变量清空
            queryResult: q,
            zanArray: [], //赞了的,纯净的,点赞、取消一系列操作最后剩下的处于点赞状态的
            allZan: [], //所有点过的赞,没去重
            noZanArray: [], //取消赞的,需要更新数据的 loves id 
            dynamicsid: [], //取消赞的,说说id,要减一 
            page: this.data.page + 1 //页数加1
          })
     
        }
     
      },
     
    for循环调用上面方法
    ------------------
                for (var i = 0; i < res.data.length; i++) {
                  //循环获取每一条说说的点赞状态和数量关注 收藏
                  this.getDynamisInfo(wx.getStorageSync('openId'), res.data[i]._id, res.data[i]._openid, i, res.data, q);
     
                  //循环结束,状态不一定结束 异步
                }


    02-08
    赞同
    回复 1
    • Mr.Hope
      Mr.Hope
      03-05

      谁跟你讲小程序支持await了

      03-05
      1
      回复
  • 瘦
    02-08

    目前云开发数据库没有关联表这种东西 这里偷偷给你推荐另一个免费数据库bmob 你想要的功能都有

    (就是不知道这条发言会不会被禁掉)


    另外异步变同步可将for循环改写成函数嵌套

    执行完一次后i+1然后再调用自身 用i控制什么时候出去


    要注意qps30的限制 实测一秒20次数据库操作比较稳定 所以必要的话再调用自身之前写个延时50毫秒执行

    02-08
    赞同
    回复