2016-06-17 30 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