【问题标题】:Unable to access the variable in NodeJs function无法访问 NodeJs 函数中的变量
【发布时间】:2016-06-18 02:43:56
【问题描述】:

我正在使用 NodeJS postgresql 客户端通过它获取一些数据循环并提供输出。我将 ExpressJS 与 postgresql 客户端一起使用。

这是我的代码

    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 多个循环才能完成,然后才能进行响应调用。

那么请告诉我如何实现它。 我做错了什么,如何解决? 非常感谢

【问题讨论】:

  • 但问题是函数在循环内,所以我无法在函数内返回数据。我一直等到循环完成。因此,在 client.query 调用中做出响应并不简单。
  • 您应该查看 nodejs postgres 驱动程序文档。然后,您将意识到您拥有数据的回调函数异步发生,因此您的 res.json 调用正在发送尚未有机会更新的信息。

标签: javascript node.js postgresql express npm


【解决方案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
}

【讨论】:

  • 另外,您也可以使用 Promise。对于这种情况,您可以构建一个 promise 数组,每个 promise 使用 user_info 解析并使用 .all(promises)(例如 RSVP.all())依次调用它们。
  • 我实际上并不喜欢 Promise,并且觉得它们解决问题的能力不如正确架构的回调。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2022-01-10
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多