2016-06-17 34 views
-1

我正在使用NodeJS postgresql客戶端通過它獲取一些數據循環並提供輸出。我使用ExpressJS和postgresql客戶端。無法訪問NodeJs函數中的變量

這是我的代碼

var main_data = some array of data 
    var user_info = {} 
    for (var key in result.rows) { 
     var user = main_data[key].user 

     client.query('SELECT name,age,address FROM users WHERE user_id = $1 LIMIT 1;' , [user], function(queryErr, result){ 
     var return_data = result.rows[0] 
     user_info.name = return_data.name 
     user_info.gender = return_data.gender 
     user_info.address = return_data.address 
     main_data[key].user_info = user_info 
    }) 
    } 

    done() 
    res.json(main_data) 
    return 

然而,當我運行此代碼,我沒有得到正確的輸出。用戶信息不會被推送到main_data。它只是輸出main_data變量,就像代碼的開頭一樣。

它不是簡單的重複建議 因爲函數坐鎮內線一個for循環,所以我不能只是作出反應,一旦調用該函數完成。我必須等到整個循環完成後,纔可以響應呼叫,這可能需要1000多個循環才能完成。

那麼告訴我如何實現它。 我在做什麼錯,如何解決? 非常感謝你

+2

的[我如何返回從一個異步調用的響應?(可能的複製http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an異步調用) – undefined

+0

但問題是函數是在一個循環內,所以我不能在函數內返回數據。我一直等到循環結束。因此,在client.query調用中做出響應並不簡單。 – rksh

+0

您應該簽出nodejs postgres驅動程序文檔。然後你會意識到你有數據的回調函數是異步發生的,因此你的res.json調用發送的信息還沒有機會被更新。 – Paul

回答

1

我會爲此使用async.js,我自己。

var rows = // your result.rows stuff. 

function doTheQuery(item, callback){ 
    // your query logic here, calling the callback with the results 
} 

async.series(rows, doTheQuery, function(err){ 
    // handle any errors 
} 
+0

或者,您也可以使用承諾。對於這種情況,你可以建立一個承諾數組,每個承諾用'user_info'解決,並使用'.all(promise)'(例如[RSVP.all()](https://www.npmjs.com/package/rsvp #array-of-promise))可以連續調用它們。 – Squirrel

+0

我實際上不是承諾的忠實粉絲,並且覺得他們沒有比正確構建的回調更好的解決問題。 – Paul