node.js + 请求 => node.js + 蓝鸟 + 请求

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

我正在尝试了解如何使用 promises 编写代码。 请检查我的代码。这样对吗?

Node.js + 请求:

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 + 蓝鸟 + 请求:

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 还是更有趣的东西?

查看状态码的一种方法:

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

您可以简单地检查 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);

如果你注意到,我们 return 从 spread 处理程序中解析 JSON,因为 JSON.parse 不是异步函数,所以我们没有在单独的 then 处理程序中完成。