async.series究竟是如何执行它的功能的呢?

时间:2017-01-09 06:41:39

标签: node.js asynchronous callback

据说Async.series按顺序执行该功能,但它不适合我,

我的代码:

var mysql=require('mysql');
var async=require('async'); 
var con;
var EID=30;
var res;
async.series([
    function(callback) {
      console.log("inside first func");
      con = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: '',
        database: 'imd2'
      });
      callback();
    },
    function(callback) {
      console.log("inside second function");
      var sql = "select EName from users where EID=" + EID;
      con.query(sql, function(err, rows) {
        console.log("inside query");
        res = rows;
      });
      callback();
    }
  ],
  function(err) {
    console.log("third function");
    if (err)
      return next(err);
    console.log(res);
  });
console.log("hi");

我的输出是

inside first func
inside second function
third function
undefined
hi
inside query

如果我更改了con.query()中的第二个函数的回调 然后输出变为

inside first func
inside second function
hi
inside query
third function
[ RowDataPacket { EName: 'AndhraPradesh' } ]

我的预期输出是

inside first func
inside second function
inside query
third function
[ RowDataPacket { EName: 'AndhraPradesh' } ]
hi

如果我错了,请纠正我,但是应该在最后调用函数(错误),然后“hi”应该显示正确吗?(根据给出的定义) 我该怎么办才能获得预期的产量呢?

P.S“hi”只是一个调试,在执行async.series之后会有非常重要的代码,它不会最适合async.series中的新函数 感谢

1 个答案:

答案 0 :(得分:1)

function(err)这里只是异步系列的回调。你想要做的一切 系列之后必须在这里完成。在此函数中移动console.log("hi")应该会有所帮助。

function(err) {
    console.log("third function");
    if (err)
        return next(err);
    console.log(res);
    console.log("hi");
});

第二点是在异步系列中,callback()只是调用下一个函数。现在的问题是你在系列的第二个函数中使用了另一个异步方法。

function(callback) {
    con.query(sql, function(err, rows) {
        console.log("inside query");
        res = rows;
    });
    callback();
}

con.query是具有回调函数的异步任务。异步意味着您不知道何时处理回调。因此,您需要在callback()的回调中调用con.query,如此:

function(callback) {
    con.query(sql, function(err, rows) {
        console.log("inside query");
        res = rows;
        callback();
    });
}

这样,只有当您从查询中收到结果(并记录在“查询内部”)时,才会触发下一个函数。