使用覆盖保证默认捕获实现

时间:2016-02-23 10:39:52

标签: javascript promise es6-promise

我有一个包含多种服务和方法的API。我希望手动处理这些调用中的一些,例如,如果在某种程度上预期会出现错误,则会向用户显示一条有用的错误消息。

对于其余的调用,我想要" catch"的默认实现。这将发出一些消息,某些全局侦听器将处理并显示更通用的错误消息。

我发现了另一个堆栈溢出帖子几乎给了我想要的东西: Promises and generic .catch() statements

也就是说,默认捕获但重新抛出错误。问题是,如果我为某些特定服务实现自己的catch,我不希望通用catch会启动,因为这会显示全局泛型错误。

有没有办法让catch的默认实现被覆盖,如果catch是手动实现的?

示例:

let promise = pageService.getPage({pageId})
.then( (resp) => {} )
// on error, use the default catch

let promise = pageService.getPage({pageId})
.then( (resp) => {} )
.catch( (error) => { /* I want to handle the error, override the default error implementation */} )

1 个答案:

答案 0 :(得分:2)

据我所知,承诺在“先到先得”的基础上工作,这意味着第一个注册其捕获函数也将是第一个被调用的函数。

到目前为止,我能想出的唯一,丑陋的解决方法是扩展正在处理的错误,以便我能够识别它是否已被处理。如果我们采用你前面的例子:

const pageService = {
    getPage: (pageId) => {
        return doStuff(). catch((error) => {
            error.handled = false;
            setTimeout(() => {
                if(!error.handled) {
                    // do your default handling
                }
            )}, 1);
        });
        throw error; //Let possible other handlers first have their go 
    }
}

let promise = pageService.getPage({pageId})
.then( (resp) => {} )
// on error, use the default catch

let promise = pageService.getPage({pageId})
.then( (resp) => {} )
.catch( (error) => {
    //handle the error here
    error.handled = true;
 })