nodejs承诺更好地处理promise实现中发生的错误?

时间:2018-05-12 22:48:17

标签: javascript node.js exception-handling try-catch es6-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);
        });
    });
}

最终奏效了。但是,我的问题是有更好的方法来处理承诺实现之外的这些错误吗?

非常感谢!

1 个答案:

答案 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}}