这可能很多次被问到,但我无法找到适合我的解决方案的例子。这是我返回一个承诺的主要示例,我嘲笑响应主体以使其失败。我正在尝试处理异常以捕获它并正确记录它。
const request = require('request');
var url = "https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=BTC-STRAT&tickInterval=hour";
function requestMarketData() {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
var result = JSON.parse("<HTML>"); // make JSON.parse fail
return resolve(result);
});
});
}
async function getMarketData() {
var result = await requestMarketData();
}
getMarketData();
我试图处理它的第一种方式;
async function getMarketData() {
try {
var result = await requestMarketData();
} catch(err) {
console.log("Failed result: " + err);
}
}
由于异步工作而无法正常工作。
第二种方法是为返回的promise附加catch处理程序;
function requestMarketData() {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
var result = JSON.parse("<HTML>"); // make JSON.parse fail
return resolve(result);
});
}).catch(err => {
console.log("Failed result: " + err);
});
}
也不起作用。
第三种方式;
function requestMarketData() {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
var result = [];
try {
result = JSON.parse("<HTML>"); // make JSON.parse fail
} catch(err) {
result = [{foo: "bar"}];
return reject(result);
}
return resolve(result);
});
});
}
最终奏效了。但是,我的问题是有更好的方法来处理承诺实现之外的这些错误吗?
非常感谢!
答案 0 :(得分:2)
当JSON解析失败时,您的JSON.parse
函数需要导致拒绝承诺。现在,它在Promise
处抛出一个错误,没有什么可以捕获它(function requestMarketData() {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
var result;
try {
result = JSON.parse("<HTML>"); // make JSON.parse fail
} catch (err) {
return reject(err);
}
return resolve(result);
});
});
}
构造函数只捕获在其中同步抛出的错误)。你可以自己抓住它:
function requestMarketData() {
return new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
return resolve(body);
});
}).then(JSON.parse);
}
但Promise#then
也会为你抓住它:
function requestMarketData() {
let body = await new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
return resolve(body);
});
});
return JSON.parse(body);
}
等效地,使用异步函数:
{{1}}