【问题标题】:how to use deferred with https.request in nodejs如何在nodejs中使用带有https.request的deferred
【发布时间】:2014-06-04 20:07:58
【问题描述】:

我使用 github 在我的节点应用程序中进行身份验证。我已经构建了以下代码:

var req = request(postOptions, function (res) {
  res.on('data', function (d) {
    ...
    var getOptions = parseUrl('https://api.github.com/user?access_token=' + accessToken);
    ...
    var req = request(getOptions, function (resp) {
      ...
      resp.on('data', function (d) {
        ...
      })
        .on('end', function () {
           ...
        })
    });

    req.end();
  });
});

req.write(postData);
req.end();

我删除了一些代码,因为这里的重点是我在请求中有一个请求。现在,nodejs 有deferreds 问题是这是否可以用来简化上面的代码?

【问题讨论】:

  • 查看promisify。但一般来说,代码必须支持 Promise 才能使 Promise 起作用。
  • 这段代码有什么问题?
  • @mihai 事件比承诺/延迟提供更多的粒度。 Promise 可以被实现或拒绝,并且只有一次,它们与手头任务相关的状态是正在运行或已完成。承诺中没有事件“数据”的等价物。事件使您能够逐步完成任务,承诺只告诉您运行和退出代码。有可能用promise代替它。但它们缺乏表现力。

标签: javascript node.js httprequest deferred


【解决方案1】:

嗯,你没有错误处理。 Promises 显着清理了正确传播错误的代码,并且不会因为这些代码变得自动而泄漏资源。所以不可能进行公平的比较,因为不处理错误的承诺代码仍然会传播它们。

var Promise = require("bluebird");
var request = Promise.promisifyAll(require("request"));

function githubAuthenticate() {
  return request.postAsync(postOptions, postData)
    .spread(function(response, body) {
      var accessToken = ...
      var getOptions = parseUrl('https://api.github.com/user?access_token=' + accessToken);
      return request.getAsync(getOptions);
    })
    .spread(function(response, body) {

    });
}

现在想象一下,如果这里发生了故障?您只需在一个地方添加一次.catch,然后在那里处理它。由于错误会自动传播,因此上面的代码不需要做任何事情。消费者代码可以这样做:

  gitHubAuthenticate().then(function() {

  }).catch(function(err) {
      // Any error that happened with the post, get or your code gets here
      // automatically
  });

【讨论】:

  • 嗯,我认为“客户”的用法令人困惑。
  • @Roamer-1888 怎么会这样? :P
  • "Client" 表示客户端-服务器的客户端。鉴于我们在这里讨论的是 node.js,所有这些都可能在服务器端运行。如果我是对的,那么我会通过说“消费者代码......”来避免歧义。
  • @Roamer-1888 是的,客户端代码是指调用代码,或者如您所说的 api 的使用者,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2019-05-04
  • 2020-01-29
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多