2016-09-13 5 views
0

In jedem $ http Anruf mit .then(successFunc) und .catch(errFunc) (alternativ then(successFunc, errFunc) die then/success wird immer dann aufgerufen (das Versprechen erfolgreich aufgelöst).

Beispiel

$http.get('/some/resource') 
// /some/resource --> HTTP 400 
    .then(function(response) 
    { 
     console.log('success'); 
    }) 
    .catch(function(reason) 
    { 
     console.log('error'); 
    }) 

// Console: 
// - success 

dies ist das beabsichtigte Verhalten oder was verursacht das?

+0

Dies ist nicht das Standardverhalten, sondern möglicherweise auf einen Antwort-Interceptor zurückzuführen, den Sie in Ihrer Anwendung verwendet haben. In der Regel sind die Antwort-Interzeptoren global und Sie wissen vielleicht nicht, dass sie vorhanden sind, wenn es sich um eine große Anwendung handelt. Können Sie diesen Code in einer Geige isolieren, um das gleiche Problem zu reproduzieren? – arunkjn

+0

Ich habe dies als selbst beantwortete Q & A Frage erstellt, um es für andere Leute zu halten, da es keine ähnliche Frage hier auf SO gab. Sie beschreiben genau das Problem, auf das ich mit diesem Beitrag hinweisen wollte (siehe auch meine ausführliche Antwort). Immer noch danke für die Antwort :) – Aides

Antwort

1

Nein, dies ist kein beabsichtigtes Verhalten.Normalerweise sollte es .then() aufanrufenund .catch() auf HTTP 4xx und HTTP 5xx (nicht sicher über die anderen).

Das beschriebene Verhalten wird wahrscheinlich durch ein weiteres .catch() verursacht, das eine aufgelöste Zusage zurückgibt.

In einem etwas geändert Beispiel:

//In some Service: 
function getResources() 
{ 
    $http.get('/some/resource') 
    // /some/resource --> HTTP 400 
     .then(function(response) 
     { 
      console.log('service success'); 
      return response; 
     }) 
     .catch(function(reason) 
     { 
      console.log('service error'); 
      // IMPORTANT: although this is returned 
      // in a .catch() it returns a resolved promise 
      return reason; 
     }); 
} 

//In some Controller: 
someService.getResources() 
    .then(function(response) 
    { 
     console.log('controller success'); 
    }) 
    .catch(function(reason) 
    { 
     console.log('controller error'); 
    }); 


// Console: 
// - service error 
// - controller success 

Beachten Sie, dass dies auch von einer registrierten http interceptor verursacht werden:

$httpProvider.interceptors.push(function($q) 
{ 
    return { 
     'response': function(response) 
     { 
      // do something 
      return response; 
     }, 
     'responseError': function(rejection) 
     { 
      // do something 
      return rejection; // <-- this causes the problem 
      // instead do 
      return $q.reject(rejection); 
     } 
    } 
} 
1

Ihr Beispiel wandelt eine Ablehnung zu einem aufgelösten Versprechen.

$http.get('/some/resource') 
// /some/resource --> HTTP 400 
    .then(function(response) 
    { 
     console.log('success'); 
     //IMPORTANT -- return to chain data 
     return response; 
    }) 
    .catch(function(reason) 
    { 
     console.log('error'); 
     //IMPORTANT -- throw to chain rejections 
     throw reason; 
    }) 

Wenn eine catch-Handler eine throw Anweisung lässt, gibt die Funktion undefined die wandelt die Ablehnung zu einem Versprechen, dass undefined löst.

Suchen Sie in Ihrem Code für eine http interceptor, die das gleiche fehlerhafte Muster folgt. Die Regel in der funktionalen Programmierung ist immer return (oder throw) etwas.

+0

Dies ist das erste Mal, dass ich das 'throw' Schlüsselwort im Einsatz mit Versprechungen gesehen habe. Haben Sie ein Beispiel, das das richtige Verhalten zeigt? – Aides

+0

Siehe [Winkelausführungsreihenfolge mit '$ q'] (http://stackoverflow.com/a/34326388/5535245) – georgeawg

+0

Ich habe es gerade in einer Geige getestet - funktioniert wie beschrieben, aber es verbreitet den Fehler immer noch an den Browser, daher würde ich lieber 'return $ q.reject (reason)' über 'throw reason' bevorzugen (siehe [Angular $ http docs] (https://docs.angularjs.org/api/ng/service/$http#interceptors)). – Aides

Verwandte Themen