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