【问题标题】:Wait a async operation before execute render in express using NodeJs在使用 NodeJs 快速执行渲染之前等待异步操作
【发布时间】:2016-03-12 18:26:48
【问题描述】:

我最近开始使用 NodeJs,我正在尝试创建一个 API,该 API 将从网络中获取一些信息,编译并显示给用户。

我的问题是关注

router.get('/', function (req, res, next) {
  https.get(pageUrl, function (res) {
     res.on('data', function (responseBuffer) {
         //Important info;
        info = responseBuffer;
     }
   }

   res.render('page', { important: info});
 }

我怎样才能等到我有“信息”变量然后发送 res.render。因为现在如果我尝试等待它通常程序结束并且不等待结果。

谢谢。

【问题讨论】:

  • res.render 放在res.on 回调中,就在info 赋值的正下方
  • @Michael,你能解释一下你的解决方案吗? tymeJV 我确实尝试过,但没有成功。

标签: node.js asynchronous express


【解决方案1】:

假设您的https.get 调用为您提供了一个带有'end' 事件的流[1],您可以执行以下操作:

router.get('/', function (req, res, next) {
  https.get(pageUrl, function (res) {
     var info;

     res.on('data', function (responseBuffer) {
         //Important info;
        info = responseBuffer;
     }

     res.on('end', function() {
       res.render('page', { important: info});
     })
   }
 }

请注意,上面的代码将不起作用,因为您使用来自https.get 回调的res 参数隐藏了基本res 参数。

另外,请注意'data' 事件可能会多次发出(再次假设标准流实现[1]),因此您应该将结果累积到您的info 变量中。

[1]能否请您发布有关您的代码的更多信息,例如 https 库的来源(它是标准的 HTTPS 库吗?)。


个人想法:我强烈建议使用request module,通过npm install request 在 NPM 上负责,用于对外部服务的 HTTP(S) 请求。它有一个简洁的界面,易于使用并为您处理很多情况(重定向是一个例子,JSON 和 Content-Type 另一个)。

【讨论】:

  • 这很有帮助。我确实听从了您的建议并开始使用请求库,这也是一个非常好的主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2018-09-03
  • 1970-01-01
相关资源
最近更新 更多