Обещание реализации catch по умолчанию с переопределением

У меня есть API с несколькими сервисами и методами. Некоторые из этих вызовов я хочу обрабатывать вручную, например отображать полезное сообщение об ошибке для пользователя, если ошибка ожидается.

Для остальных вызовов мне нужна реализация «catch» по умолчанию, которая будет выдавать сообщение, которое будет обрабатывать какой-либо глобальный прослушиватель, и отображать более общее сообщение об ошибке.

Я нашел еще один пост о переполнении стека, который почти дает мне то, что я хочу: Promises и общие операторы .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)


Насколько мне известно, promises работает по принципу "первым пришел - первым обслужен", то есть тот, кто первым зарегистрирует свою функцию catch, также будет вызван первым.

Единственный уродливый обходной путь, который я смог придумать, заключался в том, чтобы расширить обрабатываемую ошибку, чтобы я мог узнать, была ли она уже обработана. Если мы возьмем ваш предыдущий пример:

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