node.js + sequelize +顺序执行
在我的节点应用程序中,我必须执行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使用蓝鸟承诺:
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
而这个代码基本上做你的上面的代码的一切:)
- 你不需要尝试/抓住,如果(err)检查承诺 – 他们照顾你。 如果你扔进一个承诺处理程序,你是安全的。
- Promises链,如果你从promise返回一个promise的值,那么它会用这个promise来解决它(这意味着你可以添加一个
.then
处理程序)
你可以做得更好,但是你可以返回promise的值(也就是return sequelize.query
)并完全切换到promise API。