我想在节点应用程序中执行数据库操作。我期望的是一个接一个地执行查询,即顺序执行第二个查询取决于先前的操作。当前,我正在使用async.series模块来达到预期的结果,但是,当我编写嵌套查询时,查询将异步执行。如何在执行嵌套查询时消除这种异步行为?以下是我的代码。
async.series([
function(callback){
dbClient.query(select_show_query,function(err,result1){
callback(err,result1.rows);
}) //dbclient query end
},//function end
function(callback){
dbClient.query(select_show_person_query,function(err,result2){
callback(err,result2.rows);
}) //dbclient query end
},//function end
function(callback){
dbClient.query(select_show_role_query,function(err,result3){
callback(err,result3.rows);
}) //dbclient query end
},//function end
function(callback){
dbClient.query(select_show_episode_query,function(err,result4){
callback(err,result4.rows);
}) //dbclient query end
},//function end
function(callback){
dbClient.query(select_show_genre_query,function(err,result5){
callback(err,result5.rows);
}) //dbclient query end
},//function end
function(callback){
dbClient.query(select_profile_photo_query,function(err,result6){
callback(err,result6.rows);
}) //dbclient query end
}//function end
],function(err,results){
if(err){
res.json({"status": "failed", "message": err.message})
}
else{
res.send(JSON.stringify(results));
}
} //function end
); //async end
答案 0 :(得分:2)
使用ES2017(ES8)的异步/等待状态:
async function operations(){
try {
let result1 = await dbClient.query(select_show_query);
let result2 = await dbClient.query(select_show_person_query);
let result3 = await dbClient.query(select_show_role_query);
let result4 = await dbClient.query(select_show_episode_query);
let result5 = await dbClient.query(select_show_genre_query);
let result6 = await dbClient.query(select_profile_photo_query);
} catch(err) {
return res.json({"status": "failed", "message": err})
}
// ... do something with result1.rows
// ... do something with result2.rows
// ...
}
答案 1 :(得分:0)
您可以使用异步瀑布方法。
import waterfall from 'async/waterfall';
连续运行任务的函数数组,每个函数将其结果传递给数组中的下一个。但是,如果任何任务将错误传递给自己的回调,则不会执行下一个函数,并且会立即在错误中调用主回调。
async.waterfall([
function(callback) {
callback(null, 'one', 'two');
},
function(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
// Or, with named functions:
async.waterfall([
myFirstFunction,
mySecondFunction,
myLastFunction,
], function (err, result) {
// result now equals 'done'
});
function myFirstFunction(callback) {
callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
}
function myLastFunction(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}