微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-具有承诺的MySQL-失去价值

在下面的代码中,目标是为每个帖子填充点赞字段.我正在查询posts表并将post转换为对象.基于此转换结果集中的值,我正在查询点赞表,并尝试将相应的点赞结果集动态添加到posts对象,如下所示.

Likes字段似乎已成功添加到map函数中.但是,由于处理promise的某些问题,likes字段在then()代码块外部不存在.

知道为什么会这样吗?感谢您提供有关如何解决此问题的帮助.

router.post('/load', (req, res) => {

    connection.then( (conn) => {
        return conn.query("SELECT userId, postId FROM posts");
    }).then( (postsRows) => {

        let posts = postsRows.map((r) => Object.assign({}, r));

        posts = posts.map( (post, i) => {
            if( posts[i].totalLikes ) {
                connection.then( (conn) => {
                    return conn.query("SELECT u.userId, u.first, u.last FROM likes l JOIN posts p ON p.postId = l.postId JOIN users u ON u.userId = l.userId WHERE p.postId = ?", [post.postId]);
                }).then( (likesRows) => {
                    posts[i].likes = likesRows.map((r) => Object.assign({}, r));
                });
            }
        });

        return posts;

    }).then( (posts) => {
         console.log(posts);
    });
});

解决方法:

变化:

>只需将映射链接在一起
>映射时无需使用i进行访问,因为该项目已作为第一个参数给出
>由于您正在映射承诺,因此必须使用Promise.all之类的东西来解决它们
>您已经解决了连接问题,然后无需再次进行连接.您可以从上层范围重用conn.
>也许您也可以将复制的对象提取到帮助程序中以进一步清理内容

这是代码

const copyObject = o => Object.assign({}, o));
connection.then(conn => 
  conn
    .query("SELECT userId, postId FROM posts")
    .then(postRows => Promise.all(
      postRows
        .map(copyObject)
        .map((post) => {
          const getLikes = post.totalLikes
            ? conn.query("SELECT u.userId, u.first, u.last FROM likes l JOIN posts p ON p.postId = l.postId JOIN users u ON u.userId = l.userId WHERE p.postId = ?", [post.postId])
            : Promise.resolve([]);
          return getLikes
            .then(likesRows => {
              post.likes = likesRows;
              return post;
            });
        })
    ))
)
.then(posts => {
  console.log(posts);
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐