2017-10-10 6 views
1

J'ai une situation où mon application a besoin de récupérer des données de l'arrière, puis de faire plusieurs étapes de traitement avec de telles données. Ce que je mettre en œuvre quelque chose commeAngular http - Chaîne Observables avec des sorties conditionnelles

this.http.get('myurl') 
      .map(data => doFirstProcessingStep(data)) 
      .map(data1 => doSecondProcessingStep(data)) 
      .map(data2 => doThirdProcessingStep(data)) 

En cas si le back-end n'envoie pas de données valides, je veux sortir de la chaîne de traitement sans exécuter une étape et juste retourner un Observable.of(null)

Ce qui est une manière élégante de mettre en application une telle logique?

+0

Si le service renvoie une erreur, vous devriez attraper. sinon, pensez à utiliser le filtre – methgaard

+0

Il n'est pas nécessaire d'avoir une erreur. L'extrémité arrière peut renvoyer un ensemble de données vide. Pourriez-vous fournir plus de détails sur la façon dont vous appliqueriez les filtres? – Picci

Répondre

1

Si vous utilisez la nouvelle HttpClient, votre réponse est automatiquement converties en JSON. Et, si votre backend renvoie une réponse vide, le JSON.parse qui se passe derrière les rideaux va générer une erreur. Dans une chaîne observable, si une erreur est générée, tous les autres opérateurs sont ignorés dans la chaîne jusqu'à ce qu'ils trouvent une catch. Donc, il devrait certainement fonctionner comme prévu de cette façon:

this 
    .http 
    .get('myurl') 
    .map(data => doFirstProcessingStep(data)) 
    .map(data1 => doSecondProcessingStep(data)) 
    .map(data2 => doThirdProcessingStep(data)) 
    .catch(err => Observable.of(null)) 
0

Vous pouvez le faire comme ci-dessous:

this.http.get('myurl') 
    .map(data => this.doAllProcessing(data)); 

doAllProcessing(data) { 
    if (!dataIsValid(data)) { 
     return null; 
    } 
    data = doFirstProcessingStep(data); 
    data = doSecondProcessingStep(data); 
    data = doThirdProcessingStep(data); 

    return data; 
}