因此,函数getStuff可以工作,但是每当.get方法中出现错误时,我就会遇到问题。参见getStuff2。
const request = require('superagent');
function getStuff() {
return new Promise(function (resolve, reject) {
request
.get('http://google.com')
.end(function (err, res) {
console.log('getting to end cb');
if (err) reject(err);
resolve(res.body);
})
});
}
function getStuff2() {
return new Promise(function (resolve, reject) {
request
.get('abc')
.end(function (err, res) {
console.log('getting to end cb');
if (err) reject(err);
resolve(res.body);
})
});
}
//works
getStuff().then(function (htmlBody) {
console.log(htmlBody);
}).catch(function(err) {
console.log('err');
});
//doesn't work
getStuff2().then(function (htmlBody) {
console.log(htmlBody);
}).catch(function(err) {
console.log('err');
});在getStuff2中似乎没有正确处理来自superagent的错误,因为我在捕获中看不到控制台日志消息。
发布于 2016-08-16 01:50:58
正如@robertklep指出的那样,存在DNS解析问题。下面是本地路由的DNS通配符stats.research.icann.org/dns/wildcard。如果您将代码更改为不同的虚拟url,则会捕获错误。即
const request = require('superagent');
function getStuff2() {
return new Promise(function (resolve, reject) {
request
.get('bing-bong-bang')
.end(function (err, res) {
console.log('getting to end cb');
if (err) return reject(err);
resolve(res.body);
})
});
}
getStuff2().then(function (htmlBody) {
console.log(htmlBody);
}).catch(function(err) {
console.log('err');
}在本例中,错误被正确捕获。DNS错误最终会超时,但需要一分钟时间。
发布于 2016-08-14 04:42:58
您对您遇到的确切问题很含糊,但我在下面的代码中失败了:
if (err) reject(err);
resolve(res.body);调用reject不会导致其余代码停止运行,因此它会导致后续的异常,因为res是未定义的(因此访问res.body将抛出TypeError)。
这是一个很好的实践,在你拒绝一个承诺后结束当前的函数:
if (err) return reject(err);或者将其设为if-else:
if (err) {
reject(err);
} else {
resolve(res.body);
}发布于 2016-08-14 04:34:46
试着这样做:
getStuff2().then(function (htmlBody) {
console.log(htmlBody);
}, function(err) {
throw err;
}).catch(function(err) {
console.log(err.message);
});Reject不会抛出错误,你自己要对此负责。
https://stackoverflow.com/questions/38936699
复制相似问题