обещание nodejs - лучший способ обработки ошибок, возникающих в реализации обещания? - PullRequest
0 голосов
/ 13 мая 2018

Это, вероятно, задавалось много раз, но я не смог найти подходящий пример для своего решения.Вот основной пример, когда я возвращаю обещание и высмеиваю тело ответа, чтобы оно не сработало.Я пытаюсь обработать исключение, чтобы перехватить его и правильно его зарегистрировать.

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);
    }
}

, который не сработал, что ожидаетсяиз-за асинхронной работы.

Второй способ с добавлением обработчика 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 голосов
/ 13 мая 2018

Ваша функция requestMarketData должна вызывать отклонение обещания при сбое анализа 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;

            <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>
}
...