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

问题描述 投票:1回答:2

我想在节点应用程序中执行数据库操作。我期望的是一个接一个地执行查询,即顺序地执行查询,因为第二查询依赖于先前的操作。目前,我使用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
node.js postgresql async.js
2个回答
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
    // ... 

}

0
投票

你可以使用异步瀑布方法。

import waterfall from 'async/waterfall';

运行函数的tasks数组,每个函数将结果传递给数组中的下一个。但是,如果任何任务将错误传递给它们自己的回调,则不执行下一个函数,并立即调用主回调并显示错误。

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

© www.soinside.com 2019 - 2024. All rights reserved.