【问题标题】:Catching errors in ES6 promises在 ES6 Promise 中捕获错误
【发布时间】:2015-07-21 20:10:27
【问题描述】:

有人对 ES6 Promise 有任何想法吗?我在我的 Node 应用程序中使用它们,我很喜欢它们。但我发现,如果我在解析回调中遇到某种错误,它不会抛出错误或执行拒绝回调,这会让我的服务器无限挂起。

现在我已经采取了这种做法,并手动拒绝了带有捕获错误的承诺,但我不确定这是否是一种很好的处理方式,和/或我是否应该使用承诺。

this.dataStore.set(newID, value).then( (foo) => {
    try{
        this.var = foo;
        res({val: foo});
    }catch(e){
        rej(e);
    }
}, (e) => {
    rej(e);
});

【问题讨论】:

标签: javascript node.js promise ecmascript-6


【解决方案1】:

我认为混淆是由于以下事实造成的

function setStore(newID, value) {
    return new Promise(function(res, rej) {
        this.dataStore.set(newID, value).then( (foo) => {
            try{
                this.var = foo;
                res({val: foo});
            }catch(e){
                rej(e);
            }
        }, (e) => {
            rej(e);
        });
    });
}

顺便说一句,最后的(e) => { rej(e); }部分可以改写为e => rej(e),反过来又可以改写为rej

但无论如何,您不需要任何周围的机器来创建和返回您自己的承诺,因为this.dataStore.set 和/或随后对then 的调用已经创建了一个承诺,您可以按原样返回。不要创建自己的新承诺,然后根据传递给then 的结果使用小散列解决新承诺,只需返回散列 - 这将成为结果承诺的值.当对dataStore.set 的调用失败时,不要拒绝你的新承诺,而是让失败的承诺成为它自己。

所以你不需要做任何比

更复杂的事情
function setStore(newID, value) {
    return this.dataStore.set(newID, value).then(foo => {
        this.var = foo;
        return {val: foo};
    });
}

this.var = foo; return {val: foo}; 部分中发生的错误(但怎么可能呢?)将自动将 Promise 置于失败状态。 this.dataStore.set 导致的失败将按原样产生失败的 Promise,无需捕获它并重新抛出它——失败将沿着链条愉快地进行。

将其用作:

setStore('abc', 123) 
    .then(hash => console.log(hash.val))
    .catch(e => console.log("The sky is falling", e));

为了澄清,如下:

promise.then(success, failure)

success 回调中出现的错误failure 回调中处理。 success 回调中的失败将在链的连续阶段中处理。您可以使用

处理success(或promise本身)中的故障
promise.then(success).catch(failure)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2017-05-06
    • 2019-04-07
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多