繁体   English   中英

ES6中的捕获错误有望实现

[英]Catching errors in ES6 promises

有没有人对ES6承诺有任何想法,我在我的Node应用程序中使用它们,我喜欢它们,大多数情况下。 但是我发现如果我在一个解决回调中遇到某种错误,它就不会抛出错误或者执行拒绝回调,它会让我的服务器无限地挂起。

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

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

我认为混淆的原因在于,基于你对resrej使用,你可能会在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); }在端部可以被重写为e => rej(e) ,这反过来又可以被重写为rej

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

所以你不应该做任何比这更复杂的事情

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

this.var = foo; return {val: foo};发生错误this.var = foo; return {val: foo}; this.var = foo; return {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)

success回调中出现的错误不会failure回调中处理。 success回调中的失败将在链的连续阶段中处理。 你可以用success处理失败(或promise自己)

promise.then(success).catch(failure)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM