我编写了以下代码,但它没有返回tDate值,接收到未定义的错误。 console.log显示结果,我认为我使用全局变量错误的方式 似乎在循环之后,tDate仍然没有启动,(在循环内部它正在接收值)我如何定义全局变量?
function getDates(){
var tDate;
var pool = new ConnectionPool(poolConfig, config);
pool.requestConnection(function (err, connection) {
if(!err) {
var sql = "SELECT MAX(Date) from datatable";
var request = new Request(sql, function(err, rowCount) {
if (err) {
console.log(err);
}
// Release the connection back to the pool.
connection.close();
});
request.on('row', function(columns) {
columns.forEach(function(column) {
if (column.value === null) {
console.log('NULL');
} else {
var date = column.value;
var sDate = new Date(date);
sDate = sDate.toISOString().slice(0,10);
tDate = 'Today= ' + sDate;
console.log(tDate);
}
});
});
connection.on('connect', function(err) {
connection.execSql(request);
});
}
});
return tDate;
}
答案 0 :(得分:2)
您所犯的代码的经典错误将按照您所看到的顺序执行。它没有赢。您正在绑定事件侦听器,如果发生某些事情,它将调用回调函数。只有这样(在request.on('row'
回调中)才会修改tDate
的值。
在大多数情况下,ASYNCHRONOUS操作请求都是这样的:
function testCallback()
{
var someVar = 213;
setTimeout(function()
{
someVar = 'New value';
}, 10000);//10 seconds
return someVar;
}
console.log(testCallback());
这将不需要10秒才能记录,而是几乎立即记录213,但10秒后,(现在无法访问)变量someVar
将被重新分配。
您可以通过执行以下操作来测试:
function testCallback()
{
var valObj = {someVal: 213};
setTimeout(function()
{
valObj.someVal = 'new value';
}, 10000);
return valObj;
}
var o = testCallback();
console.log(o.someVal);//213, still
// wait 10 seconds
console.log(o.someVal);//new value <--