在异步node.js环境中执行数据库操作

时间:2019-03-20 06:03:26

标签: node.js postgresql async.js

我想在节点应用程序中执行数据库操作。我期望的是一个接一个地执行查询,即顺序执行第二个查询取决于先前的操作。当前,我正在使用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

2 个答案:

答案 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');
}

来源:https://caolan.github.io/async/docs.html