先看一段代碼:
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的使用吧。