【发布时间】:2018-10-22 23:47:18
【问题描述】:
这可能被问了很多次,但我找不到适合我的解决方案的示例。这是我返回承诺并模拟响应主体使其失败的主要示例。我正在尝试处理异常以捕获它并正确记录它。
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 实现之外有更好的方法来处理这些错误吗?
非常感谢!
【问题讨论】:
-
“由于异步工作而无法正常工作。” 这不是预期的原因。
await一个被拒绝的promise应该抛出一个错误,你可以用try捕获。问题是解析失败不会导致 promise 被拒绝。 -
@Ry 感谢您的回复我对 nodejs 有点陌生。但是,如果这是真的,为什么我无法捕捉到错误?并且当出现错误时,promise 是否返回拒绝?
标签: javascript node.js exception-handling try-catch es6-promise