javascript全局变量和返回值

时间:2014-10-20 09:00:08

标签: javascript

我编写了以下代码,但它没有返回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;
}

1 个答案:

答案 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 <--