【问题标题】:Responding to request from Node.js using Promises使用 Promises 响应来自 Node.js 的请求
【发布时间】:2014-05-26 04:42:57
【问题描述】:

我正在尝试设置一个 Node.js 脚本来使用 ECMAScript 6 承诺。我能够在 Node 脚本中完成我需要的工作,这需要多次获取外部服务器(因此在时间上很昂贵),但无法响应客户端,因为 Promises 构造导致对响应的引用丢失(所以我猜)。

如何将 Response 对象传播到最后一个 Promises then() 并回复请求?

var http = require("http");
var Promise = require('es6-promise').Promise;
//...

var promise = new Promise(function(resolve, reject){
   //...
   var req = http.request(options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (data) {
         buffer += data.toString();
      });
      res.on('end',function(d){
         //...stuff done with buffer...
         return resolve(0);
      });
  });

  req.end();
});

promise.then(function(i){

   //...expensive work on array...

   return Promise.all(myArrayData);
});

promise.then(function(result){
   //...want to reply to the request here, e.g.,...
   res.write(result);
});

【问题讨论】:

  • 如果你路由到 promise,req 对象将很容易访问
  • 我可能会使用缓冲区响应解决 http.request 包装承诺,然后将其传递出去。
  • 垫子,我回答了这个问题,但我不确定这就是你的意思 - 如果你只想访问 your 本地 res 变量,你可以使用闭包并将var response; 在顶部,然后 response = reshttp.request 回调的第一行。
  • RUJordan,我如何“传递承诺”?

标签: javascript node.js promise ecmascript-6


【解决方案1】:

您只需将服务调用放在路由处理程序中:

app.get("/",function(req,res){
    myService().then(function(result){
        res.write(result);
        // res.end();
    });
});

就像在同步代码中一样,您在希望执行的上下文中调用函数:

var data = myService();
doSomethingWith(data);

【讨论】:

  • (我不确定这与承诺有什么关系)。
  • 这没有回答问题。我知道这是一个范围界定问题,但使用 Promise 构造,我不确定如何访问响应对象。
  • @Mat 您的问题不清楚。您的工作代码如何使用回调?如果它是同步的,它会是什么样子?
  • Benjamin Gruenbaum,我想后续回调可以使用从先前回调返回的值,但 Promises 的工作方式似乎有点不同。 @RUJordan 提到(在问题 cmets 中)该方法是“路由承诺”,但承诺对我来说是新的(因此是问题),所以我想要一种有效使用它们将数据返回给客户端的方法。跨度>
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2019-08-10
  • 2015-06-23
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2014-07-24
相关资源
最近更新 更多