Angular 1.6.0: błąd" prawdopodobnie nieobsługiwane odrzucenie " [duplikat]
To pytanie ma już odpowiedź tutaj:
- możliwe odrzucenie nieobsługiwane w kątowym 1.6 9 odpowiedzi
Mamy wzór rozwiązywania obietnic w naszej aplikacji Angular, który służył nam dobrze do czasu Angular 1.6.0:
resource.get().$promise
.then(function (response) {
// do something with the response
}, function (error) {
// pass the error the the error service
return errorService.handleError(error);
});
A oto jak wyzwalamy błąd w karmie:
resourceMock.get = function () {
var deferred = $q.defer();
deferred.reject(error);
return { $promise: deferred.promise };
};
Teraz, wraz z aktualizacją do 1.6.0, Angular jest nagle skarży się w naszych testach jednostkowych (w karmie) na odrzucone obietnice z "prawdopodobnie nieobsługiwanym błędem odrzucenia". Ale obsługujemy odrzucenie w drugiej funkcji, która wywołuje naszą usługę błędów.
Czego dokładnie Szuka Angular? Jak chce, abyśmy "poradzili sobie" z odrzuceniem?
11 answers
Spróbuj dodać ten kod do konfiguracji. Miałem kiedyś podobny problem i to obejście pomogło.
app.config(['$qProvider', function ($qProvider) {
$qProvider.errorOnUnhandledRejections(false);
}]);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 02:11:28
Wyświetlony kod obsłuży odrzucenie, które nastąpi przed wywołaniem .then
. W takiej sytuacji zostanie wywołane drugie wywołanie zwrotne, które przekażesz .then
, a odrzucenie zostanie obsłużone.
jednak , gdy obietnica, na którą dzwonisz .then
jest pomyślna, wywołuje 1st callback. Jeśli to wywołanie zwrotne rzuca wyjątek lub zwraca odrzuconą obietnicę, to wynikowe odrzucenie nie będzie obsługiwane , ponieważ drugie wywołanie zwrotne nie obsługuje odrzuceń w przyczyna przez 1. tak działają implementacje promise zgodne ze specyfikacją Promises/A+, A Angular promises są zgodne.
Możesz to zilustrować następującym kodem:
function handle(p) {
p.then(
() => {
// This is never caught.
throw new Error("bar");
},
(err) => {
console.log("rejected with", err);
});
}
handle(Promise.resolve(1));
// We do catch this rejection.
handle(Promise.reject(new Error("foo")));
Jeśli uruchomisz go w Node, który również jest zgodny z Promises / a+, otrzymasz:
rejected with Error: foo
at Object.<anonymous> (/tmp/t10/test.js:12:23)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
(node:17426) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: bar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-09 16:39:15
Znalazłem problem, cofając się do Angular 1.5.9 i ponownie uruchamiając test. Był to prosty problem z wtryskiem, ale Angular 1.6.0 zastąpił to przez wyrzucenie błędu "prawdopodobnie nieobsługiwanego odrzucenia", zaciemniając rzeczywisty błąd.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 16:08:12
Pierwszą opcją jest po prostu ukrycie błędu przy jego wyłączeniu poprzez skonfigurowanie errorOnUnhandledRejections
w konfiguracji $qProvider zgodnie z sugestią Cengkuru Michael
Ale to wyłączy tylko logowanie. Sam błąd pozostanie
Lepszym rozwiązaniem w tym przypadku będzie-obsługa odrzucenia metodą .catch(fn)
:
resource.get().$promise
.then(function (response) {})
.catch(function (err) {});
Linki:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 06:49:40
Proszę sprawdzić odpowiedź tutaj:
Możliwe odrzucenie w kątowym 1.6
Zostało to naprawione za pomocą 316f60f i poprawka jest zawarta w v1.6.1 release.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-05 12:58:38
Zaobserwowałem to samo zachowanie podczas wykonywania testu. To dziwne, że na produkcji kod działa dobrze i nie tylko na testach.
Łatwym rozwiązaniem, aby twoje testy były szczęśliwe, jest dodanie catch(angular.noop)
do Twojej obietnicy. W przypadku powyższego przykładu powinien wyglądać tak:
resourceMock.get = function () {
var deferred = $q.defer();
deferred.reject(error);
return { $promise: deferred.promise.catch(angular.noop) };
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 10:06:48
Możesz zamaskować problem, wyłączając błąd errorOnUnhandledRejections, ale błąd mówi, że musisz "poradzić sobie z ewentualnym odrzuceniem", więc musisz tylko dodać haczyk do swojej obietnicy.
resource.get().$promise
.then(function (response) {
// do something with the response
}).catch(function (error)) {
// pass the error the the error service
return errorService.handleError(error);
});
Odniesienie: https://github.com/angular-ui/ui-router/issues/2889
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 18:32:21
Miałem również do czynienia z tym samym problemem po aktualizacji do Angular 1.6.7, ale kiedy spojrzałem w kod, błąd został wyrzucony dla $interval.cancel(interval);
dla mojego przypadku
Mój problem został rozwiązany po zaktualizowaniu angular-mocks
do najnowszej wersji (1.7.0).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 16:21:52
Aby uniknąć konieczności wpisywania dodatkowego .catch(function () {})
w kodzie w wielu miejscach, możesz dodać decorator
do $exceptionHandler
.
Jest to bardziej gadatliwa opcja niż inne, ale musisz dokonać zmiany tylko w jednym miejscu.
angular
.module('app')
.config(configDecorators);
configDecorators.$inject = ["$provide"];
function configDecorators($provide) {
$provide.decorator("$exceptionHandler", exceptionHandler);
exceptionHandler.$inject = ['$delegate', '$injector'];
function exceptionHandler($delegate, $injector) {
return function (exception, cause) {
if ((exception.toString().toLowerCase()).includes("Possibly unhandled rejection".toLowerCase())) {
console.log(exception); /* optional to log the "Possibly unhandled rejection" */
return;
}
$delegate(exception, cause);
};
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-27 22:05:08
To może nie twoja speficzna sytuacja, ale miałem podobny problem.
W moim przypadku używałem angular-i18n i otrzymywałem słownik locale asynchronicznie. Problem polegał na tym, że otrzymywany plik json był nieprawidłowo wcięty (mieszanie spacji i tabulatorów). Żądanie GET nie zawiodło.
Poprawienie wcięć rozwiązało problem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 13:45:41
Miałem to samo ogłoszenie pojawia się po wprowadzeniu pewnych zmian. Okazało się to dlatego, że zmieniłem jedno żądanie $http
na wiele żądań za pomocą usługi angularjs $q
.
$q.all(request1, request2).then(...)
Zamiast
$q.all([request1, request2]).then(...)
Mam nadzieję, że to zaoszczędzi komuś czasu.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 22:59:24