这可能被问过很多次,但我找不到适合我的解决方案的示例。这是我返回一个 promise 并模拟响应主体以使其失败的主要示例。我正在尝试处理异常以捕获它并正确记录它。
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);
});
});
}
终于成功了。但是,我的问题是有没有更好的方法来处理 promise 实现之外的此类错误?
非常感谢!
最佳答案
您的 requestMarketData
函数需要在 JSON 解析失败时导致 Promise 被拒绝。现在,它在 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;
<b>try {</b>
result = JSON.parse("<HTML>"); // make JSON.parse fail
<b>} catch (err) {
return reject(err);
}</b>
return resolve(result);
});
});
}
但是Promise#then
也会为您捕捉到:
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);
<b>return resolve(body);</b>
});
})<b>.then(JSON.parse)</b>;
}
同样,使用异步函数:
function requestMarketData() {
<b>let body = await </b>new Promise(function(resolve, reject) {
request(url, function(err, res, body) {
if (err) {
console.log(err);
return reject(err);
}
console.log("GET: " + url);
<b>return resolve(body);</b>
});
});
<b>return JSON.parse(body);</b>
}
关于javascript - Nodejs Promise 有更好的方法来处理 Promise 实现中发生的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311300/