javascript - Nodejs Promise 有更好的方法来处理 Promise 实现中发生的错误吗?

标签 javascript node.js exception try-catch es6-promise

这可能被问过很多次,但我找不到适合我的解决方案的示例。这是我返回一个 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/

相关文章:

javascript - JS 构造函数和数组

node.js - 使用 Node js 在 mongodb 中过滤对象子对象

powershell - 尝试仅在终止异常时起作用吗?

javascript - 为什么 "this.props.match.params.authorName"在 ReactJS 中给出未定义/空值

ruby-on-rails - 如何继续 Ruby 中的下一个救援 block ?

java - Tomcat 6 - 静态初始化程序中的错误被 NoClassDefFoundError 隐藏

javascript - 如果内容是几个空格,为什么 TinyMCE getContent() 返回空字符串/

javascript - 一次切换多个复选框

JavaScript 宽高比计算器

javascript - MongoDB 数组在数据库中变成了字符串