2017-01-09 43 views
0

Async.series被说成是顺序执行的功能,但它不适合我,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 

纠正我,如果我错了,但功能(错误)应该在最后被调用,然后在“喜”应显示正确的?(从给出的定义) 我应该怎么做才能获得预期的产出?

PS“喜”只是一个调试,会有非常重要的代码后进行async.series,它不会在里面async.series一个新的函数中最适合 感谢

+0

console.log(“hi”);不在async.series调用中,如果需要在以下函数中强制执行调用,则应使用async.series –

+0

这些异步系列管理内部顺序好吧,您刚刚忽略了PS。部分,事情是,console.log(“hi”)被一系列默认同步的函数和语句所取代,并且不需要额外更改,如果我需要将所有函数内部的async合并到第二个函数,我相信这将是一个糟糕的质量计划。这个问题的症结在于sectond函数,我相信在使mysql查询语法同步时可能会有不同的解决方法。 –

回答

0

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(); 
    }); 
} 

这样,只有当您收到的结果从查询(并记录“里面查询”)的下一个功能将被触发。

+0

再一次,你忽略了PS部分,console.log(“你好”)实际上是一系列更大的语句,理想情况下应该在async.series函数之外,理想情况下在async.series之后执行,并且我保留了回调函数在con.query()里面,并且在问题中显示了结果(第二个输出代码) –

+0

@VishwanthIronHeart你可以在系列之外用系列之后要执行的代码创建一个函数。然后在你的'function(err)'中调用这个函数。你显示的代码有'con'之外的回调函数。查询“,所以我猜你不知道要把它。我只是想澄清这一点。 –

+0

有无论如何与你个人联系?我敢肯定,即使这个问题解决了,还会有两个分叉,而且我很难阅读nodejs的文档... 另外,关于你的评论,http://stackoverflow.com/问题/ 41521097/alexa-and-mysql-remote-endpoint-can-be-called-or-has-invalid-input。通过我引用这个问题,你会明白为什么从函数的回调(err)调用函数不会再好。因为这个问题中的代码片段已经在函数中。 –