Angular 1.6.0: Fehler „Möglicherweise unbehandelte Ablehnung“. [duplicate]

Lesezeit: 5 Minuten

Benutzer-Avatar
Groucho

Wir haben ein Muster zum Auflösen von Versprechen in unserer Angular-App, das uns bis Angular 1.6.0 gute Dienste geleistet hat:

    resource.get().$promise
        .then(function (response) {
        // do something with the response
        }, function (error) {
            // pass the error the the error service
            return errorService.handleError(error);
        });

Und so lösen wir den Fehler in Karma aus:

    resourceMock.get = function () {
        var deferred = $q.defer();
        deferred.reject(error);
        return { $promise: deferred.promise };
    };

Jetzt, mit dem Update auf 1.6.0, beschwert sich Angular in unseren Unit-Tests (in Karma) bei abgelehnten Promises plötzlich mit einem „Possably unhandled rejection“-Error. Aber wir behandeln die Ablehnung in der zweiten Funktion, die unseren Fehlerdienst aufruft.

Was genau sucht Angular hier? Wie sollen wir mit der Ablehnung „umgehen“?

  • Ich habe das auch in unserer Codebasis bemerkt. Seltsamerweise funktioniert das Ausführen der Suite mit dem Chrome Launcher einwandfrei. PhantomJS ist derjenige, der sich beschwert.

    – Mario Tacke

    19. Dezember 2016 um 19:58 Uhr

  • Wenn Sie dies erhalten und nicht nur aktualisiert haben, können Sie Ihre Angular-Version folgendermaßen überprüfen: stackoverflow.com/questions/16017699/…

    – hubatisch

    8. Mai 2017 um 18:16 Uhr

  • Die akzeptierte Antwort empfiehlt, den Fehler auszublenden. Das Duplikat schlägt mit dieser Antwort eine robustere Alternative vor.

    – georgeawg

    14. August 2018 um 1:16 Uhr


Benutzer-Avatar
Cengkuru Michael

Versuchen Sie, diesen Code zu Ihrer Konfiguration hinzuzufügen. Ich hatte einmal ein ähnliches Problem, und diese Problemumgehung hat den Zweck erfüllt.

app.config(['$qProvider', function ($qProvider) {
    $qProvider.errorOnUnhandledRejections(false);
}]);

  • Ich muss darauf hinweisen, dass dies lediglich den Fehler verbirgt, laut Entwickler gibt es ein Problem im Code, und es maskiert nur den Fehler.

    – Sachin Sharma

    11. Juli 2017 um 23:22 Uhr

  • Stimmen Sie zu, obwohl es das Problem vermeiden kann, bleibt die Grundursache bestehen und der Entwickler sollte stattdessen den Fehlerfall behandeln.

    – Schraube

    17. August 2017 um 16:19 Uhr

  • Welche Konfigurationsdatei speziell?

    – Hobbamok

    27. September 2018 um 11:16 Uhr

Benutzer-Avatar
Ludwig

Der angezeigte Code verarbeitet eine Ablehnung, die vor dem Aufruf von auftritt .then. In einer solchen Situation leiten Sie den 2. Rückruf weiter .then angerufen und die Ablehnung bearbeitet.

Jedochwenn das Versprechen, auf dem Sie anrufen .then erfolgreich ist, ruft es den 1. Callback auf. Wenn dieser Rückruf eine Ausnahme auslöst oder ein abgelehntes Promise zurückgibt, wird diese resultierende Ablehnung nicht behandelt, da der 2. Callback keine vom 1. verursachten Zurückweisungen behandelt. Genau so versprechen Implementierungen, die mit dem konform sind Versprechen/A+ Spezifikationsarbeit und Angular Promises sind konform.

Sie können dies mit folgendem Code veranschaulichen:

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")));

Wenn Sie es in Node ausführen, das ebenfalls Promises/A+ entspricht, erhalten Sie:

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

  • Gute Argumente! Ja, die Absicht besteht darin, die Ablehnung zu behandeln, die vor dem Aufruf von .then auftritt. Der Code, der diese Ablehnung auslöst (und der für Angular 1.5.9 funktionierte), wurde der ursprünglichen Frage hinzugefügt.

    – Groucho

    9. Dezember 2016 um 16:48 Uhr


  • Wie kann man den angeforderten Mustercode tatsächlich reparieren?

    – VIP

    13. Dezember 2016 um 14:05 Uhr

  • Ok, fix ist wie $promise.then(success).catch(error), wobei catch alle Fehler abfängt, mehr im Abschnitt “Hinweis” unter Migration

    – VIP

    13. Dezember 2016 um 19:00 Uhr

  • das sollte eigentlich sein Korrekt Antworten

    – tcmoore

    12. Februar 2018 um 21:22 Uhr

  • Was ist, wenn Ihre Funktion ein absichtlich abgelehntes Versprechen zurückgibt? Ähnlich wie $http.get() ein Versprechen zurückgibt, das absichtlich abgelehnt wird, wenn die Anfrage fehlschlägt. Ich habe Funktionen, die Versprechungen zurückgeben, und in bestimmten Fällen können sie $q.reject(err) zurückgeben, es scheint, dass Angle das nicht mag, es sei denn, ich schlage die Warnungen aus?

    – Ryan Silva

    29. März 2018 um 17:20 Uhr

Benutzer-Avatar
Andrii Verbytskyi

Die erste Möglichkeit besteht darin, einen Fehler einfach zu verbergen, indem Sie ihn durch Konfigurieren deaktivieren errorOnUnhandledRejections in der $qProvider-Konfiguration wie vorgeschlagen Cengkuru Michael

ABER dies schaltet nur die Protokollierung aus. Der Fehler selbst bleibt bestehen

Die bessere Lösung in diesem Fall wird – mit einer Absage umgegangen .catch(fn) Methode:

resource.get().$promise
    .then(function (response) {})
    .catch(function (err) {});

LINKS:

Das Problem wurde durch Zurücksetzen auf Angular 1.5.9 und erneutes Ausführen des Tests gefunden. Es war ein einfaches Injektionsproblem, aber Angular 1.6.0 hat dies ersetzt, indem es stattdessen den Fehler „Possibly Unhandled Rejection“ ausgegeben hat, wodurch der eigentliche Fehler verschleiert wurde.

Benutzer-Avatar
Urielzen

Um zusätzliches Tippen zu vermeiden .catch(function () {}) In Ihrem Code könnten Sie an mehreren Stellen a hinzufügen decorator zum $exceptionHandler.

Dies ist eine ausführlichere Option als die anderen, aber Sie müssen die Änderung nur an einer Stelle vornehmen.

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);
        };
    }
};

Benutzer-Avatar
Sylvain Rodrigue

Sie könnten das Problem maskieren, indem Sie errorOnUnhandledRejections deaktivieren, aber der Fehler besagt, dass Sie „eine mögliche Ablehnung behandeln“ müssen, also müssen Sie Ihrem Versprechen nur einen Haken hinzufügen.

resource.get().$promise
    .then(function (response) {
    // do something with the response
    }).catch(function (error)) {
        // pass the error to the error service
        return errorService.handleError(error);
    });

Bezug: https://github.com/angular-ui/ui-router/issues/2889

Bitte überprüfen Sie die Antwort hier:

Möglicherweise unbehandelte Ablehnung in Angular 1.6

Dies wurde mit behoben 316f60f und der Fix ist in der enthalten Version v1.6.1.

  • Bekomme das immer noch in 1.6.2

    – Daniel Bonnell

    17. Mai 2017 um 17:55 Uhr

  • Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzufügen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. – Aus Bewertung

    – Mostafa Berg

    5. Februar 2018 um 12:14 Uhr

  • @MostafaTorbjørnBerg danke. Ich habe die Antwort aktualisiert.

    – Piotr Pradzynski

    5. Februar 2018 um 12:59 Uhr

1083480cookie-checkAngular 1.6.0: Fehler „Möglicherweise unbehandelte Ablehnung“. [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy