Angularjs $http Abfangjäger – kann Nicht generiert werden (Aufruf requestError

Ich bin mit $http Abfangjäger für die Erfassung aller Ereignisse in Folge einer ajax-Vorlage. Aus irgendeinem Grund, ich bin nicht in der Lage zu werfen eine requestError. Ich habe eine test-app, um zu versuchen, und rufen Sie requestError, aber bisher kann ich nur bekommen, mehrere responseErrors.

Vom angularjs docs:

requestError: interceptor aufgerufen wird, wenn eine Vorherige interceptor warf einen Fehler behoben oder mit einer Ablehnung.

Dies ist mein test-code.

        .factory('httpInterceptor',['$q',function(q){

            var interceptor = {};

            var uniqueId = function uniqueId() {
                return new Date().getTime().toString(16) + '.' + (Math.round(Math.random() * 100000)).toString(16);
            };

            interceptor.request = function(config){
                config.id = uniqueId();
                console.log('request ',config.id,config);
                return config;
            };

            interceptor.response = function(response){
                console.log('response',response);
                return response;                    
            };

            interceptor.requestError = function(config){
                console.log('requestError ',config.id,config);
                return q.reject(config);
            };

            interceptor.responseError = function(response){
                console.log('responseError ',response.config.id,response);
                return q.reject(response);                    
            };

            return interceptor;

        }])

        .config(['$httpProvider',function($httpProvider) {
            $httpProvider.interceptors.push('httpInterceptor');
        }])

        .controller('MainCtrl',['$http',function($http){

            var mainCtrl = this;

            mainCtrl.method = null;
            mainCtrl.url = null;

            var testHttp = function testHttp() {

                $http({method:mainCtrl.method,url:mainCtrl.url}).then(
                        (response)=>{console.log('ok',response);},
                        (response)=>{console.log('reject',response);}
                );
            };

            //api
            mainCtrl.testHttp = testHttp;

        }])

Ich habe versucht, mehrere Möglichkeiten zum erstellen von http-Fehlern, und jedes mal nur responseError aufgerufen wird. Dinge, die ich versucht habe:

  • Bekommen server zurück, andere Arten der Fehler für jede Anfrage, z.B. 400 und 500.
  • Die server zu sleep zufälligen Zeiten, um spätere Anfragen mit einer Fehlermeldung reagieren, bevor die früheren Anforderungen. Dieselbe Ressource, denselben server-Antwort.
  • Generieren 404 Fehler durch das anfordern von Ressourcen, die nicht vorhanden sind.
  • Verbindung zum internet trennen (responseError -1).

ÄHNLICHE FRAGEN

1) scheint Diese Frage die Antwort:
Wenn Funktionen verlangen, requestError, Reaktion, responseError bekommen aufgerufen, wenn das abfangen von HTTP-request und response?

Den Schlüssel paragrapgh wird:

Ein wesentlicher Punkt ist, dass jede der oben genannten Methoden kann wieder entweder ein
„normale“ Objekte/primitive oder ein Versprechen, die aufgelöst wird, mit einer
entsprechenden Wert. Im letzteren Fall, wird der nächste interceptor in der
Warteschlange warten, bis die zurückgegebenen Versprechen aufgelöst wird oder abgelehnt wird.

aber ich denke ich bin zu tun, was es verlangt, nämlich random sleep vom server, aber kein Glück. Ich bin immer reponseErrors aus der Bestellung von der Anfrage dh sobald der server antwortet.

2) Eine ähnliche Frage wurde vor ca 1 Jahr: Angular und Jasmine: so testen Sie, requestError /Ablehnung in der HTTP-interceptor?

Leider, es nur eine Erklärung für interceptors. Es gibt keine Antwort auf meine Frage.

Habe ich getestet in Chrome und Firefox. Ich hoffe, Sie verstehen, ich habe mein bestes getan, um eine Lösung zu finden, aber ich bin nicht gekommen, über eine Lösung, die so noch.

  • Alle Ihre Beispiele umfassen die Reaktion von der server – oder der Mangel daran, daher ist es responseError. Wie der name schon sagt, requestError behandeln soll, die die Fehler auf der client-Seite, d.h. wenn config Objekt ist nicht richtig, oder was auch immer.
  • thx für die Zeiger. Auslösen einer Fehlermeldung und Rückgabe eines $q.reject() in der Anfrage hat nicht funktioniert. Ich werde versuchen, andere Dinge, wie vorgeschlagen, durch rubie_newbie unten.
InformationsquelleAutor dewd | 2016-09-07



2 Replies
  1. 2

    Dies geschieht, weil die Anfrage nicht abgelehnt, an jedem beliebigen Punkt. Es soll verwendet werden,wie:

    app.factory('interceptor1', ['$q', function ($q) {
      return {
        request: function (config) {
          console.log('request', config);
          if (config.url === 'restricted')
            return $q.reject({ error: 'restricted', config: config });
        }
      };
    }]);
    
    app.factory('interceptor2', ['$q', function ($q) {
      return {
        requestError: function (rejection) {
          console.log('requestError', rejection);      
          if (rejection.error === 'restricted')
            return angular.extend(rejection.config, { url: 'allowed' });
    
          return $q.reject(rejection);
        }
      };
    }]);
    
    app.config(['$httpProvider',function($httpProvider) {
      $httpProvider.interceptors.push('interceptor1');
      $httpProvider.interceptors.push('interceptor2');
    }]);

    Beachten Sie, dass Abfangjäger sollen die Arbeit im stack (ab transform* Haken in $http Anfrage), damit der Antrag kann nicht abgelehnt werden und erholte sich innerhalb von einem einzigen Abfangjäger.

    • ich denke, dass Ihr Punkt über die Trennung der Abfangjäger ist das wichtigste. ich schaffte es requestError genannt. Wenn ich $q.reject(config) innerhalb requestError, responseError wird anschließend genannt – gefolgt von einer then Fehler-Handler. Dies ist immer dann zu erwarten, oder gibt es eine Möglichkeit, um die Transaktion abzuschließen in requestError?
    • Ende request* interceptor-Kette mit Ablehnung, es wird nicht eine Anforderung. $http „Formulare“ ein Versprechen Kette von request interceptors und endet es mit einer server-Anfrage. Es kann nicht fangen es innerhalb der gleichen interceptor, denn es macht einen .then(..., ...) chain von der Anfrage Abfangjäger, nicht .then(...).catch(...). Sie können nicht machen, eine „endgültige“ Ablehnung, weil jeder folgende interceptor sollte die chance haben, zu fangen, diese Ablehnung, wenn das war Ihre Frage.
    • „End request interceptor-Kette mit Ablehnung, es wird nicht eine Anfrage dann“ ich habe Ende der Anfrage in der requestError handler mit einem $q.reject(config). Die responseError handler wurde noch nachträglich als obwohl. Entschuldigung, aber ich verstehe nicht, den rest Ihrer Antwort.
    • Damit der Auftrag nicht ausgeführt wird, responseError aus den letzten interceptor zurückkehren sollte, eine Absage. Wenn es mehrere Abfangjäger mit responseError, es gibt keine Möglichkeit, ausführen responseError Haken von einem interceptor und überspringen responseError Haken aus der Ruhe bringen.
    • Ok, also responseError werden aways genannt, bekommen nach requestError. Und in der responseError ich haben, um wieder eine $q.reject(). Ich bin dabei, und richtig, der ajax-Aufruf nicht gefeuert zu werden.Ich habe nur gefragt, ob es möglich war, zu verwerfen geradezu aus requestError und nicht subsquently Anruf mehr Rückrufe in der Kette. Da Sie sagen, dass alle Rückrufe in der Kette muss ausgeführt werden, und responseError ist in dieser Kette, Ausführung responseError nach requestError in einer einzigen Transaktion voll und ganz erwartet wird.
    • Ja, so verspricht die Arbeit. Wie oben schon gesagt, Anfrage Haken aus alle Abfangjäger sind übersetzt in einzelne Versprechen Kette, und Sie können nicht beenden in der Mitte der Kette.

  2. 0

    Hebt die responseError, weil alle Ihre Beispiele haben Fehler in Ihren Antworten. Sie können eine Anfrage Fehler, indem Sie versuchen, zu senden ungültige json, in Ihrer Anfrage oder falsch formatieren Sie Ihre Anfrage.

    • Thx für die Zeiger @ruby_newbie. Ich habe versucht, werfen einen Fehler in der request-handler, aber immer noch ein responseError. Ich werde versuchen, so etwas wie malformed json schlagen Sie vor und zurück zu Ihnen mit den Ergebnissen (hoffentlich innerhalb der nächsten 24 Stunden).
    • Zur info, ich hatte zu trennen, die Abfangjäger. Als estus Antwort zeigt unten. Schätzen Sie Ihre Eingabe auf jeden Fall.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.