【问题标题】:pg-promise: what would be the best way to obtain multiple results sets where order matterspg-promise:在顺序很重要的情况下,获得多个结果集的最佳方法是什么
【发布时间】:2018-01-02 03:54:12
【问题描述】:

这是我的幼稚代码:

db.projects.find_one(project_id, user_id)
        .then(project => {
            if (!project) {
                req.flash('info', 'Project not found');
                res.redirect('./projects');
            } else {
                db.codifier.get(project.project_id)
                    .then(codifier => {
                        codifier = build_codifier(codifier);
                        res.render('project', {project: project, codifier: codifier})
                    })

            }
        })

所以基本上,我想获得一个项目,如果找到 - 我想收集一些相关数据,即编码器,到单独的结果集中,所以我可以用 {project: project, codifier: codifier }。

我知道嵌套的 .then 语句看起来很糟糕......有没有更好的方法来做到这一点?谢谢!

【问题讨论】:

  • 不,嵌套的then 语句不一定是坏的,只要你正确地return 它们以便你可以链接它们。在您的情况下-条件下的异步调用-它们甚至是不可避免的。
  • 你可以试试类似这个的方法:stackoverflow.com/questions/39805736/…

标签: node.js promise pg-promise


【解决方案1】:

我知道嵌套的 .then 语句看起来很糟糕......有没有更好的方法来做到这一点?谢谢!

这很糟糕,因为您没有重复使用数据库连接,为每个查询请求一个新连接。您应该使用tasks 在查询之间共享连接。

Chaining Queries

向数据库存储库类添加另一个方法的示例:

getCodifier(project_id, user_id) {
    // use the repository object object
    return this.db.task(t => {
        // you can access repository methods on the context here:
        return t.projects.find_one(project_id, user_id)
            .then(project => {
                if (project) {
                    return t.codifier.get(project.project_id)
                }
            });
    });
}

或者,如果它不可重复使用,您可以在需要的地方执行任务。

【讨论】:

  • Vitaly,task如何返回多个结果集?
  • @KonstantinRybakov 任务返回你从它的回调中返回的任何东西。
  • 谢谢你,维塔利!任务确实有效,代码看起来好多了。感谢优秀的图书馆!
  • @KonstantinRybakov 我为您的案例添加了一个示例。
猜你喜欢
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2019-03-21
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多