如何在nodejs中使用延迟的https.request

时间:2014-06-04 20:07:58

标签: javascript node.js httprequest deferred

我使用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问题是,这是否可用于简化上述代码?

1 个答案:

答案 0 :(得分:2)

好吧,你没有错误处理。 Promise会显着清理正确传播错误的代码,并且不会泄漏资源,因为这些代码会自动生成。因此,进行公平比较是不可能的,因为没有处理错误的承诺代码仍会传播它们。

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
  });