node.js + request => node.js + bluebird + request

时间:2015-06-28 09:20:12

标签: javascript node.js promise bluebird

我试图了解如何使用promises编写代码。 检查我的代码plz。这是对的吗?

Node.js + request:

request(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var jsonpData = body;
        var json;
        try {
            json = JSON.parse(jsonpData);
        } catch (e) {
            var startPos = jsonpData.indexOf('({');
            var endPos = jsonpData.indexOf('})');
            var jsonString = jsonpData.substring(startPos+1, endPos+1);
            json = JSON.parse(jsonString);
        }
        callback(null, json);
    } else {
        callback(error);
    }
});

Node.js + bluebird + request:

request.getAsync(url)
   .spread(function(response, body) {return body;})
   .then(JSON.parse)
   .then(function(json){console.log(json)})
   .catch(function(e){console.error(e)});

如何查看回复状态?我应该使用if第一个例子还是更有趣的东西?

2 个答案:

答案 0 :(得分:11)

您只需检查response.statusCode处理程序中的spread是否不是200并从中抛出Error,以便catch处理程序将处理它。你可以像这样实现它

var request = require('bluebird').promisifyAll(require('request'), {multiArgs: true});

request.getAsync(url).spread(function (response, body) {
    if (response.statusCode != 200)
        throw new Error('Unsuccessful attempt. Code: ' + response.statusCode);
    return JSON.parse(body);
}).then(console.log).catch(console.error);

如果你注意到,我们从spread处理程序返回解析的JSON,因为JSON.parse不是异步函数,所以我们不必在单独的{{1}中执行它处理程序。

答案 1 :(得分:0)

检查状态代码的一种方法:

.spread(function(response, body) {
  if (response.statusCode !== 200) {
    throw new Error('Unexpected status code');
  }
  return body;
})