Обещайте внедряване на catch по подразбиране с отмяна

Имам API с няколко услуги и методи. Някои от тези обаждания искам да обработвам ръчно, например показване на полезно съобщение за грешка на потребителя, ако грешката е донякъде очаквана.

За останалите обаждания искам имплементация по подразбиране на "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 */} )

person Fraction    schedule 23.02.2016    source източник
comment
Да приемем, че този код е напълно синхронен с обработка на изключения, извършвана с try/catch - как бихте го написали?   -  person Benjamin Gruenbaum    schedule 23.02.2016


Отговори (1)


Доколкото знам, обещанията работят на принципа „първи дошъл, първи обслужен“, което означава, че първият, който регистрира своята функция за улавяне, ще бъде и първият, който ще бъде извикан.

Единственото, грозно заобиколно решение, което можах да измисля досега, беше да разширя обработената грешка, така че да мога да разпозная дали вече е обработена. Ако вземем предишния ви пример:

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;
 })
person HSchmidt    schedule 12.08.2016