javascript
  • json
  • node.js
  • undefined
  • 2014-01-15 65 views 0 likes 
    0

    我已經得到了返回來自PostGIS的數據庫檢索一些數據的JSON功能:由函數返回的Javascript(node.js)值未定義?

    function ObtenerPuntosIniciales(TablaOrigen,callback) 
        { 
         var conexion = "postgres://postgres:[email protected]"+ 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]]} 
    

    我想這個問題是在功能上,它沒有返回值放入變量,也可以是異步的問題。

    +0

    是的,這是一個重複。 @Aitor請看看上面發佈的鏈接。 – randunel

    +1

    鏈接解決了顯示函數內部數據的問題,我已經有了這個工作(請參閱我也使用回調)。我需要的是在功能外顯示它。 – Egidi

    回答

    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 
    }); 
    
    相關問題