2017-03-14 173 views
0

我對Javascript和node.js來說很新,而且在解決這個問題時遇到了一些麻煩。據我所知,這應該產生預期的結果,但我有一些相當奇怪的輸出(參見評論)。父範圍變量不能在子範圍內被修改

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; 
} 

感謝您的幫助!

編輯:看起來像多掛的執行是異步的, EDIT2一個問題:問題解決了,只好用的,而不是試圖用回報回調...

+0

當函數返回時,它還沒有完成getconnection()和connection.query()的回調,所以行中的值仍然是初始值。您的函數不應該返回值,而應該接受一個回調作爲參數,並用結果調用它。 –

+0

這與範圍無關,它更多的是從異步函數獲取值 –

+0

在行'rows = results;'之前放置一個'console.log()'調用,並且在'return rows'行之前放一個' 。然後查看電話發生的順序。這應該有助於你理解發生了什麼。返回調用在分配給「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是異步如此你在你的db查詢執行之前返回你的行。您需要使用回調

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


     return; 
    } 

    // do something with result 
} 

getHistoryFromDb(handleDBQuery); 
+0

那麼如何從異步中返回?你不能 – epascarello

+0

嘿,謝謝你的回答,我明白你的意思,但我已經嘗試了你的解決方案,它仍然返回null。 @epascarello和我如何繼續? – aslad

+0

'node.js是異步的 - 不,它不是 –