2017-12-29 8 views
0

Ich bin verwirrt oder kann nicht verstanden, wie eckige Versprechen funktioniert. Ich versuche, einige Codeblöcke für meine Fehlerbehandlung zu schreiben, aber ich sehe, dass es immer Erfolgsblock in meinem Controller ausführt. Allerdings habe ich auch Erfolg und Fehler in meinem Service geschrieben, weil ich eine Transformation in meiner Antwort brauche. Ich sehe, dass es einen Fehlerblock im Dienst ausführt, was vollkommen in Ordnung ist, aber das gleiche Versprechen führt einen Erfolgsblock in meinem Controller aus.

HTML

<div ng-app="myApp"> 
    <div ng-controller="MainController"> 
     <h1>{{data}}</h1> 
    </div> 
<div> 

JS

angular.module('services', []).service('myService', function($http) { 
    this.getData = function() { 
    return $http.get('test.json').then(function (response) { 
     console.log(response); 
     return response.data; 
     },function(data) { 
     console.log("Error block of service"); 
     }); 
    } 
}); 


var app = angular.module('myApp', ['services']); 

app.controller('MainController', ['$scope', 'myService', function ($scope, myService) { 
    // Call the getData and set the response "data" in your scope. 
    myService.getData().then(function(myReponseData) { 
     console.log("Success block of controller"); 
     $scope.data = myReponseData; 
    },function(data) { 
     console.log("Error block of controller"); 
     $scope.data = "Error " + data; 
    }); 
}]); 

ich reproduzieren das gleiche Problem in der Geige. Werfen Sie einen Blick

Antwort

2

Weil so ist Promise entworfen, um zu arbeiten.

Wenn Sie etwas innerhalb des catch Blocks zurückgeben, wird das, was Sie zurückgeben, ein success für den nächsten Link in der Kette.

Die einzigen zwei Möglichkeiten, um die sind:

  1. Rethrow ein Fehler innerhalb des Fang
  2. Rückkehr eines abgelehnten Versprechen innerhalb Ihrer Fang

hier ein einfacheres Beispiel:

Promise.reject(5) 
    .catch(x => x * 2) 
    .catch(err => console.log("THIS NEVER FIRES")) 
    .then(x => console.log("Value is: ", x)); 
    // => "Value is: 10" 

Promise.reject(5) 
    .catch(x => Promise.reject(x * 2)) 
    .then(x => console.log("THIS NEVER FIRES")) 
    .catch(err => console.log("Error is:", err)); 
    // => "Error is: 10" 
0

In Zurückweisungshandlern ist es wichtig, - Fehler werfen. Andernfalls wird die abgelehnten Versprechen wird auf eine erfolgreiche Versprechen umgesetzt:

angular.module('services', []).service('myService', function($http) { 
    this.getData = function() { 
    return $http.get('test.json').then(function (response) { 
     console.log(response); 
     return response.data; 
     },function(errorResponse) { 
     console.log("Error block of service"); 
     //IMPORTANT re-throw error 
     throw errorResponse; 
     }); 
    } 
}); 

Weitere Informationen finden Sie You're Missing the Point of Promises.