我试图了解如何使用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第一个例子还是更有趣的东西?
答案 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;
})