在我的节点应用程序中,我正在使用sequelize ORM。因为我必须执行3个查询,并且在执行完毕后我必须将这些结果组合成JSON格式。
我的疑问:
try {
sequelize.query("select id_0, name_0, id_1, name_1 from xxxx group by id_0, name_0, id_1, name_1").success(function (result) {
finalResult = result;
})
} catch (err) {
}
try {
sequelize.query("select yyyyyyyyyy(JSON datatype) as value from xxxxx limit 1").success(function (valueResults) {
valueResults = valueResults[0].value;
valueResults = JSON.parse(valueResults);
for (var prop in valueResults) {
keyResult.push(prop);
}
})
} catch (err) {
}
try {
sequelize.query("select country_name, level0, level1, level2, level3, level4 from levels").success(function (result) {
//console.log("ccccccc=" +util.inspect(levelsResult)); = result;
levelsResult = result;
})
} catch (err) {
}
我必须将3个输出合并为单个,我必须格式化为JSON。当我试图打印这3个输出时,由于异步调用,它会变为空。请帮我解决这个问题。谢谢。
答案 0 :(得分:2)
您可以使用流量控制包来帮助解决此问题。有纯粹的JS方法,但像async或一些承诺实现的包也可以工作(除非你想要练习)。
async
中的一个示例是async.series
或async.parallel
方法(如果需要顺序或并行,则不确定您的调用顺序)。像这样:
var async = require('async');
async.parallel({
query1 : function( cb ){
//perform query here. Put cb() inside callback, where you get results
cb(null, "result1");
},
query2 : function( cb ){
//perform query here. Put cb() inside callback, where you get results
cb(null, "result2");
},
query3 : function( cb ){
//perform query here. Put cb() inside callback, where you get results
cb(null, "result3");
}
},function parallelFinal(parallelErr, parallelResults){
if( parallelErr ) throw new Error("Something bad!");
console.log("Results are " + JSON.stringify( parallelResults ) );
});
结果:
结果是{" query1":" result1"," query2":" result2"," query3" :" result3"}
您可以根据需要在结果方法中设置和操作对象。
答案 1 :(得分:1)
要么使用@clay告诉你的解决方案,要么在查询回调中执行查询,也就是说:
var result1, result2, result3
try {
sequelize.query("select foo from bar").success(function (foo) {
result1 = foo;
try {
sequelize.query("select foo2 from bar2").success(function (bar) {
result2 = bar;
//do the 3rd query here
});
} catch (e) {
}
})
} catch (err) {
}
请记住,当您想要执行多个查询时,此方法不实用,此方法是一个简单的阻塞代码,这与node.js的工作原理(非阻塞)相反