在node.js中调用多个异步函数的正确过程

时间:2015-11-20 12:35:23

标签: javascript node.js callback

我有一个要求,我需要从表1获取记录并存储在redis缓存中,一旦redis缓存完成存储,获取表2记录并存储在redis缓存中。所以有4个异步函数。

步骤:

  1. 获取表1记录
  2. 存储在redis缓存中
  3. 获取表2记录
  4. 存储在redis缓存中
  5. 处理它的正确程序是什么。

    以下是我为处理它而编写的代码。请根据node.js

    确认其是否是正确的程序或任何其他方式来处理它
    var redis = require("redis");
    var client = redis.createClient(6379, 'path', {
        auth_pass: 'key'
    });
    
    var mysqlConnection = // get the connection from MySQL database
    
    get_Sections1()
    
    function get_Sections1() {
        var sql = "select *from employee";
    
        mysqlConnection.query(sql, function (error, results) {
            if (error) {
                console.log("Error while Sections 1 : " + error);
            } else {
                client.set("settings1", JSON.stringify(summaryResult), function (err, reply){
                    if (err) {
                        console.log("Error during Update of Election : " + err);
                    } else {
                        get_Sections2();
                    }
                });
            }
        });
    }
    
    function get_Sections2() 
    {
        var sql = "select *from student";            
    
        mysqlConnection.query(sql, function (error, results) 
        {
            if (error) 
            {
                console.log("Error while Sections 2 : " + error);
            }
            else 
            {
                client.set("settings2", JSON.stringify(summaryResult), function (err, reply) 
                {
                    if (err) 
                    {
                        console.log("Error during Update of Election : " + err);
                    }
                    else 
                    {
                        console.log("Finished the task...");
                    }
                });
            }
        });    
    }
    

2 个答案:

答案 0 :(得分:2)

创建两个参数化函数。一个用于检索,一个用于存储。

然后宣传他们两个。

然后写:

return getTableRecords(1)
  .then(storeInRedisCache)
  .then(getTableRecords.bind(null,2))
  .then(storeInRedisCache)
  .then(done);

为了宣传一个功能,这样的事情可能有用:

var getEmployees = new Promise(function(resolve, reject) {
  var sql = "select *from employee";

  mysqlConnection.query(sql, function (error, results) {
    if (error) {
      return reject();
    } else {
      return resolve(results);
    }
  });
});

如果您使用旧版本的NodeJS,则需要Promise的填充。

答案 1 :(得分:2)

以下是Ben Aston使用Promise.coroutine假设承诺的解决方案的替代方案:

const doStuff = Promise.coroutine(function*(){
     const records = yield getTableRecords(1);
     yield storeRecordsInCache(records);
     const otherRecords = yield getTableRecords(2);
     yield storeRecordsInCache(otherRecords); // you can use loops here too, and try/cath 
});

doStuff(); // do all the above, assumes promisification

或者,如果你想使用Node中尚未假设的语法(并使用Babel获得支持),你可以这样做:

async function doStuff(){
     const records = await getTableRecords(1);
     await storeRecordsInCache(records);
     const otherRecords = await getTableRecords(2);
     await storeRecordsInCache(otherRecords); // you can use loops here too, and try/cath 
})