node.js + sequelize +顺序执行

时间:2014-03-28 10:24:26

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

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

我的代码:

 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)
        }
    }

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

1 个答案:

答案 0 :(得分:3)

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

此代码基本上完成了上述代码所做的一切:)

  • 你不需要尝试/捕获,如果(错误)检查承诺 - 他们会为你照顾它。如果你扔进一个承诺处理程序你是安全的。
  • 承诺链,如果你从一个承诺中返回一个承诺的值,那么它将使用该承诺解决它(意味着你可以添加一个.then处理程序)

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