【问题标题】:Perform database operations in asynchronous node.js environment在异步 node.js 环境中执行数据库操作
【发布时间】:2019-03-28 14:33:12
【问题描述】:

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


    【解决方案1】:

    使用 ES2017 (ES8) 的 async/await:

    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
        // ... 
    
    }
    

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-01
        • 2014-04-10
        • 2016-12-11
        • 2013-06-09
        • 1970-01-01
        • 2011-03-20
        • 2021-11-28
        • 2017-06-23
        相关资源
        最近更新 更多