【问题标题】:node.js + sequelize + sequential executionnode.js + sequelize + 顺序执行
【发布时间】:2014-05-07 18:05:33
【问题描述】:

在我的节点应用程序中,我必须依次执行 2 个查询 1(即)我必须根据第一个查询的结果执行第二个查询。

我的代码:

 var levels;
        try {
            sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) {
                levels = results;               
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }
        catch (err) {
        }


if (level == 2) {
        query = "select *from xxxxxx where " + query + " and leveltype = "+levels[0].name_2+"";-----------------------------------------------------------> this is from 1st query

        try {
            sequelize.query(query).success(function(results) {
                results = tsv.stringify(results);
                onSuccess(results, callback)
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }
        catch (err) {
            logger.error(err.stack)
        }
    }

请帮我解决这个问题。提前致谢。

【问题讨论】:

  • 我对sequelize模块不熟悉。在 node_sqlite3 中,通过在第一个查询的成功回调中发送第二个查询来对查询进行排序,然后在第二个查询的成功回调中你知道两者都成功了。

标签: javascript node.js callback promise sequelize.js


【解决方案1】:

Sequelize 使用 Bluebird 承诺:

sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) {
                levels = results;               
            }).failure(function(err) {
                if (err) {
                    logger.error(err.stack);
                    throw (err);
                }
                else {
                    if (callback) {
                        callback(err, null);
                    }
                }
            });
        }

可以变成:

sequelize.query("Select * from levels where country_id = " + level0 + "")
         .then(function(results)  {
            levels = results;               
        });

承诺链:

sequelize.query("Select * from levels where country_id = " + level0 + "")
.then(function(levels)  {
     var query = "select *from xxxxxx where " + query + 
                 " and leveltype = "+levels[0].name_2+""
     return sequelize.query(query);
 }).nodeify(callback); // turn back from promise API to callback API

这段代码基本上完成了上面代码所做的一切:)

  • 您不需要 try/catch 和 if(err) 检查承诺 - 他们会为您处理。如果你在一个承诺处理程序中抛出你是安全的。
  • Promises 链,如果你从 . 中返回一个 Promise 的值,那么它将使用该 Promise 解决它(这意味着你可以添加一个 .then 处理程序)

不过,您可以做得更好,您可以返回 promise 的值(即 - return sequelize.query)并完全切换到 promise API。

【讨论】:

  • 感谢您宝贵的时间.. 正如@Paul 伤心我已经在第一个成功模块中执行了第二个查询.. 它对我有用.. 是否建议这样做.. 也适用于您上面的代码是否我必须安装任何软件包??
  • @Subburaj 你觉得哪个代码更长更易读?此外,Paul 的建议忽略了您免费获得的强大的 Promise API 的要点 - 请参阅我的问答:stackoverflow.com/questions/22539815/… 解释我建议的方法的优点。您还可以使用.nodeify 免费获得“将.then 承诺转换为节点回调”
猜你喜欢
  • 2016-01-30
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多