先看一段代码:
function select(sqlscript){
var result = "";
sql.connect(config, function(err) {
var request = new sql.Request();
request.query(sqlscript, function(err, recordset) {
result = recordset;
console.log("AAA:"+result);
});
request.on('recordset', function(columns) {
// Emitted once for each recordset in a query
});
request.on('row', function(row) {
// Emitted for each row in a recordset
});
request.on('error', function(err) {
// May be emitted multiple times
});
request.on('done', function(returnValue) {
// Always emitted as the last one
});
});
console.log("BBB:"+result);
return result;
}
var result = "";
sql.connect(config, function(err) {
var request = new sql.Request();
request.query(sqlscript, function(err, recordset) {
result = recordset;
console.log("AAA:"+result);
});
request.on('recordset', function(columns) {
// Emitted once for each recordset in a query
});
request.on('row', function(row) {
// Emitted for each row in a recordset
});
request.on('error', function(err) {
// May be emitted multiple times
});
request.on('done', function(returnValue) {
// Always emitted as the last one
});
});
console.log("BBB:"+result);
return result;
}
运行后可以看到, console.log("AAA:"+result); 这一句还是有值的,但是这一句console.log("BBB:"+result); 却是:BBB:undifined 。这是为什么呢?
原来,
一般按回调函数的逻辑,是先执行第一个console.log, 再执行第二个console.log, 但是中间一个回调函数, 比如 IO 操作其实还没执行 所以console.log执行的时候, 回调函数还没执行, 所以就没有返回值 等到数据库返回数据之后, return 的内容也就没有被捕获了,这就是异步特性带来的流程控制麻烦。
所以,
用 Node 只能把后续的步骤写在回调函数里被继续调用和执行了 可以用 promise、 generator 之类方式弄更习惯的写法, 那就赶紧学习promise、generator的使用吧。