微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-捕获ES6 Promise中的错误

是否有人对ES6承诺有任何想法,我在Node应用程序中使用它们,并且在很大程度上我喜欢它们.但是我发现,如果我在解决回调中遇到某种错误,它将不会引发错误或执行拒绝回调,这会使我的服务器无限地挂起.

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

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

解决方法:

我认为造成这种混乱的原因是,根据您在此处使用res和rej的情况,您很可能会在promise构造函数中按照以下方式调用它:

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和/或随后的随后调用已经创建了诺言,您可以按原样返回.与其创建自己的新诺言,然后根据传递给那时的结果用少量散列来解决新诺言,不如返回散列-这将成为结果诺言的价值.而不是在对dataStore.set的调用失败时拒绝新的诺言,只是让失败的诺言成为自己.

因此,您无需做任何事情都可以

function setStore(newID, value) {
    return this.dataStore.set(newID, value).then(foo => {
        this.var = foo;
        return {val: foo};
    });
}

this.var = foo;中发生错误.返回{val:foo};部分(但是怎么会这样?)将自动使承诺变为失败状态.由this.dataStore.set导致的失败将按原样产生失败的诺言,并且无需捕获并重新抛出它-失败将沿着链条迅速发展.

将此用作:

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

为了澄清起见,以下内容

promise.then(success, failure)

成功回调中发生的错误不会在失败回调中处理.成功回调中的失败将在链的连续阶段中处理.您可以通过以下方式处理成功的失败(或承诺自己)

promise.then(success).catch(failure)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐