各位大神,我是Node.js的初学者,一直在实践和学习各种Node相关的东西,近期遇到一个较为疑惑的问题。我知道一些关于async之类的组件,它可以实现部分的同步逻辑,但是,我遇到了一个问题,貌似它们也不好解决,请教一下大家,像下面这样的逻辑大家该怎样处理呢?
需求:一个对象包含一个查询mysql数据库的方法,在查询完数据库之后,将查询结果进行处理之后return出来。
这样的一个需求在PHP,Java等同步式的语言中实现很简单,但是在我写Node的时候,发现这个存在很大的问题,下面是我的伪代码,说明了我的思路:
var async = require('async');
var mysql = require('mysql');
var data = {
query: function (sql){
var result;
async.waterfall([
function (next){ //先查询sql
var conn = mysql.createConnection({...}); //建立一个连接
conn.connect();
conn.query(sql, function (err, rows, fields){ //查询数据库
if (err)
throw err;
next(null, rows); //当结果查询完毕之后,继续执行下一个业务
});
}, function (rows, next){
//....对rows进行相关的处理和操作
console.log(1);
//将处理的结果返回
result = rows;
}
]);
console.log(2);
return result; //在这里将结果返回出去
}
}
上面的思路是想在返回结果并处理完之后,再return,即先console出1,再出2。然后在另外的模块中使用:
var result = data.query('select * from xxxx');
但是实际上的结果是result为undefined,即先console出了2,然后才是1,因为data.query()中先return了result,而不是数据库查询后的赋值。
我想了很久,不知道这种情况该如何解决,貌似异步的方式无法解决这样的情况啊,。请教各位大神,像这种同步的流程和需求该如何转化成异步进行呢?是我的思路需要转变还是另有其他办法?