小程序中没有连表的功能吗?
发布于 6 年前 作者 qiangyan 7554 次浏览 来自 问答

求大佬解答

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

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

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

3 回复

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

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

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

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

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

  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);
 
              //循环结束,状态不一定结束 异步
            }

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

回到顶部