函数返回的Javascript(node.js)值是未定义的?

时间:2014-01-15 11:22:17

标签: javascript json node.js undefined

我有一个函数返回一个json,其中包含从postgis数据库中检索到的一些数据:

function ObtenerPuntosIniciales(TablaOrigen,callback)
    {  
        var conexion = "postgres://postgres:postgres2@"+ Server +"/" + BD;
        var sqlPunto='SELECT json FROM ' + TablaOrigen;
        pg.connect(conexion, function(err, client, done) {
            if(err) {
                return callback(new Error('ObtenerPuntosIniciales_error en la conexion:', err));
            }
            client.query(sqlPunto, function(err, Resultado) {
                  if(err) {
                    return callback(new Error('ObtenerPuntosIniciales_error al ejecutar la consulta:', err));
                  }
                  return callback(null,Resultado);
                  done();
            });                                                                               
        });
    }

之后我得到了一个代码片段,它将函数返回的值赋给变量,但这总是未定义的,尽管函数内部显示了值:

var ObtainedData = ObtenerPuntosIniciales(TablaOrigenDeLosPuntos,function ( err,result ) {                                                                                                                                 
        if (err) {
                  console.log('Error:' + err);
                  return;
        }
        console.log('FunctionData:' +result.rows[0].json);
        return result;
});
console.log('ObtainedData:'+ ObtainedData); 

函数内的console.log显示正确的值。 另一方面,函数外部的console.log显示未定义。

以下是控制台显示的内容:

ObtainedData:undefined

GET /?ServidorOrigenDeLosPuntos=localgis-modelo&BDOrigenDeLosPuntos=geopista&Car
garCapas=true&NombreCapa1AMostrar=Circuitos&TablaCapa1=getxo_alum_circuitos_old&
TablaOrigenDeLosPuntos=getxo_alum_circuitos_old&NombreCampoClave1OrigenPto=id&Va
lorBuscadoCampoClave1OrigenPto=3 304 421ms

FunctionData:{"type":"LineString","coordinates":[[-3.009299817715526,43.3
46455178899078],[-3.009294275536192,43.346457831419585]]}

我想问题出现在函数中,它没有将值返回到变量中,或者可能是异步问题。

1 个答案:

答案 0 :(得分:2)

在NodeJS中,如果代码中的操作是异步的,那么如果您需要使用最新异步操作的结果,那么使用该操作的任何代码也必须是异步的。

var ObtainedData = ObtenerPuntosIniciales(TablaOrigenDeLosPuntos,function ( err,result ) {                                                                                                                                 
        if (err) {
                  console.log('Error:' + err);
                  return;
        }
        console.log('FunctionData:' +result.rows[0].json);
        return result;
});


// the following will always be undefined
console.log('ObtainedData:'+ ObtainedData); 

那么你能做些什么呢?除了编写另一个函数来处理回调中的下一个操作,或者使用像async这样的控制流库之外,并不多见。在ES5中,您无法使用伪同步语法描述异步操作。其他一些语言允许这样做。

我会使用异步库(伪代码)

var async=require('async');

// given 2 functions connectDB and queryDB
async.series([connectDB,queryDB],function(err,result){
 //do some stuffs
});