Angular 1.6.0: błąd" prawdopodobnie nieobsługiwane odrzucenie " [duplikat]

To pytanie ma już odpowiedź tutaj:

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?

Author: Mistalis, 2016-12-09

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);
}]);
 62
Author: Cengkuru Michael,
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
 19
Author: Louis,
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.

 18
Author: Groucho,
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:

 15
Author: Andrii Verbytskyi,
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.

 3
Author: Piotr Pradzynski,
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) };
};
 2
Author: Valdermeyder Hussar,
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

 2
Author: giselleghadyani,
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).

 2
Author: Dilip,
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);
        };
    }
};
 1
Author: Urielzen,
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.

 0
Author: monstercode,
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.

Nie owijałem ich w szyny. np.
$q.all(request1, request2).then(...) 

Zamiast

$q.all([request1, request2]).then(...)
Mam nadzieję, że to zaoszczędzi komuś czasu.
 0
Author: JamesEddyEdwards,
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