2017-03-14 10 views
0

私はJavascriptとnode.jsでかなり新しく、これを動作させるにはいくつか問題があります。私が知る限り、これは期待される結果を生み出すはずですが、私はいくつかむしろ奇妙な出力を持っています(cf.コメント参照)。親スコープの変数は子スコープ内で変更できません

function getHistoryFromDb() { 
    var rows=1; 
    pool.getConnection(function (err, connection) { 
     // rows = 1 
     console.log(rows); 
     connection.query('SELECT * FROM messages', function (error, results, fields) { 
      connection.release(); 
      if (error) throw error; 
      // rows = 1 
      rows = results; 
      // rows = the expected output (array of objects) 
     }); 
    }); 
    // rows = 1 
    return rows; 
} 

ありがとうございました!

EDIT:それは実行が非同期 EDIT2ているにリンクされている多くの問題だように見える:問題、解決の代わりにリターンを使用しようとしているのコールバックを使用していた...

+0

を使用する必要があり、その行の値がまだ初期値です。値を返す代わりに、関数はパラメータとしてコールバックを受け入れ、結果とともに呼び出す必要があります。 –

+0

これはスコープとは関係がありません。非同期関数から値を取得することと関連があります –

+0

行 'rows = results;の前に' console.log() 'コールを置き、' return rows; 。次に、呼び出しが行われる順序を調べます。それは何が起こっているのか理解するのに役立ちます。 '行'への代入の前に戻り呼び出しが起こっています。 – RJM

答えて

0
function getHistoryFromDb(callback) { 
     var rows=1; 
     pool.getConnection(function (err, connection) { 
      // rows = 1 
      console.log(rows); 
      connection.query('SELECT * FROM messages', function (error, results, fields) { 

       if (error) throw error; 
       // rows = 1 
       rows = results; 
       connection.release(); 
       callback(null, rows); 


      }); 
     }); 

    } 

Node.jsのはとても非同期(async)ですdbクエリが実行される前に行を返します。あなたは、コールバック関数が戻るが、それはまだのgetConnection()とconnection.query()のコールバックを完了していない時点で

function handleDBQuery(err, result) { 
    if (err) { 


     return; 
    } 

    // do something with result 
} 

getHistoryFromDb(handleDBQuery); 
+0

どうすれば非同期から戻ることができますか?あなたはできません – epascarello

+0

ねえ、あなたの答えをありがとう、私はあなたが言っているものを得るが、私はあなたのソリューションを試して、それはまだnullを返しています。 @epascarelloと私はどのように進むのですか? – aslad

+0

'node.jsはasync'です - いいえ –

関連する問題