Мой вопрос состоит из двух частей:
Часть 1
Согласно стандарту ES6 Promise
Я вижу, что я вынужден везде использовать блок catch
, но он выглядит как copy /вставить и выглядит странно.
Пример:
У меня есть некоторый класс, который делает запрос к бэкэнду (давайте назовем его API
class).
И у меня есть несколько требований к классу API
с использованием:
1) Мне нужно делать запросы в разных частях моего приложения с обработкой ошибок одного запроса:
// somewhere...
api.getUser().then(... some logic ...);
// somewhere in another module and in another part of app...
api.getUser().then(... some another logic...);
2) Я хочу, чтобы блоки 'then' работали ТОЛЬКО при успешном выполнении getUsers.
3) Не знаюЯ не хочу писать catch
блок везде, где я использую api.getUsers()
api.getUser()
// I don't want following
.catch(e => {
showAlert('request failed');
})
Поэтому я пытаюсь реализовать обработку одной ошибки внутри класса для всех "запросов пользователей"
class API {
getUser() {
let promise = makeRequestToGetUser();
promise.catch(e => {
showAlert('request failed');
});
return promise;
}
}
... но если запрос не удался, я все равно вынужден использовать catch
block
api.getUser()
.then(... some logic...)
.catch(() => {}) // <- I forced to write it to avoid of “Uncaught (in promise)” warning
... в противном случае я получу предупреждение «Uncaught (in обещание)» в консоли.Так что я не знаю, как избежать блока .catch
везде, где я использую api
экземпляр.
Кажется, это происходит из-за ошибки в таком коде:
// This cause "Uncaught error"
Promise.reject('some value').then(() => {});
Может быть, вы скажете: «просто вернитесь в обещание, которое вы получили в классе».
class API {
getUser() {
return makeRequestToGetUser().catch(e => {
showAlert('request failed');
return ...
});
}
}
... но это противоречит моему # 2 требованию.
См. эту демонстрацию: https://stackblitz.com/edit/js-xqwiq1?file=index.js
Итак, мой первый вопрос как реализовать описанныйлогика без записи catch
блок везде, где я использую api
вызов?
часть 2
Я проверил, получит ли та же реализация класса API
с библиотекой Q
тот же результат и был удивлен , потому что я не получаю “Uncaught (in promise)” warning
.Кстати, это более ожидаемое поведение, чем поведение нативных обещаний ES6.
См. Эту демонстрацию https://stackblitz.com/edit/js-g6efg5
На этой странице https://promisesaplus.com/implementations Я обнаружил, что библиотека Q
является реализациейОбещания / A + спец.Но почему у него другое поведение?Соответствует ли обещание es6 требованиям Promises / A +?
Кто-нибудь может объяснить, почему эти библиотеки имеют различное поведение, какое из них правильное, и как реализовать упомянутую логику в случае, если «реализация ES6 Promises» верна?