Javascript node.js+;续集+;顺序执行
在我的节点应用程序中,我必须执行两个查询,一个接一个(即,我必须根据第一个查询的结果执行第二个查询) 我的代码:Javascript node.js+;续集+;顺序执行,javascript,node.js,callback,promise,sequelize.js,Javascript,Node.js,Callback,Promise,Sequelize.js,在我的节点应用程序中,我必须执行两个查询,一个接一个(即,我必须根据第一个查询的结果执行第二个查询) 我的代码: var levels; try { sequelize.query("Select * from levels where country_id = " + level0 + "").success(function(results) { levels = results;
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
这段代码基本上完成了上面代码所做的一切:)
- 你不需要用try/catch和if(err)来检查承诺,他们会帮你解决。如果你把一个承诺处理者扔进去,你就安全了李>
- 承诺链,如果您从中返回承诺的值,那么它将使用该承诺解析它(意味着您可以添加
。然后
处理程序)
不过,您可以做得更好,您可以返回承诺的值(即-
返回sequelize.query
)并完全切换到承诺API。我不熟悉sequelize模块。在node_sqlite3中,可以通过在第一个查询的成功回调中发送第二个查询来对查询排序,然后在第二个查询的成功回调中发送第二个查询,您知道这两个查询都成功了。感谢您宝贵的时间。。作为@Paul sad,我已经在第一个的成功模块中执行了第二个查询。它对我有效。是否建议这样做。。另外,对于您上面的代码,我是否必须安装任何软件包???@Subburaj,您认为哪种代码更长、更可读?此外,Paul所建议的方法忽略了免费获得的强大promise API的要点——请参阅我的问答:解释我所建议方法的优点。您还可以使用.nodeify