Angulaire 5 synchrone HTTP appel

J'ai Angulaire à 5 de l'application dans laquelle j'ai du appeler un lourd service REST (habituellement de quelques secondes). J'ai besoin de son résultat dans une partie différente de l'application, donc je voudrais stocker le résultat dans une DataStorageService.
En gros, c'est que j'aimerais réaliser:

@Injectable()
export class DataStorageService {

private result: MyCustomObject;

constructor(private service: Service) {}

getResult(): MyCustomObject {
    if (typeof this.result === 'undefined') {
        //save result
    }
    return result;
}

La question est de savoir comment je peux attendre jusqu'à ce que la requête HTTP est fini et puis sauvegarder et retourner le "résultat" de l'objet. J'ai essayé de le résoudre à l'aide de la Promesse et de l'Observable en tant que bien, mais aucun d'entre eux a bien fonctionné.

  1. Observables:

    if (typeof this.result === 'undefined') {
        this.service.call()
            .subscribe(response => this.result = response);
    }
    return this.result;  //wait for save and return MyCustomObject
    
  2. Promesse:

    if (typeof this.result === 'undefined') {
        this.service.call()
            .toPromise()
            .then(response => this.result = response);
    }
    return this.result;  //wait for save and return MyCustomObject
    
  • Votre getResult(): Promise<MyCustomObject> doit également retourner une promesse/observable. Sera code les codes manquants, lors de son retour du déjeuner. En attendant, regarde dans github.com/ngrx/store pourrait apporter une nouvelle solution à ce problème.
  • Je voudrais éviter le retour d'une Promesse ou Observables. J'ai besoin d'agréger le résultat en différents objets selon la page ouverte. Ce serait mon code si laid, si j'ai toujours de s'abonner à une Promesse. Au lieu d'utiliser un simple Objet.
  • Note au sujet de code de la clarté et de la maintenance: Votre méthode est nommée getResult(), mais il fait enregistrer le résultat, de sorte que le comportement ne correspond pas au nom, et qui aboutit à la confusion
  • Tu as raison David. J'ai écrit à partir de zéro pour une meilleure compréhension. Peut-être qu'il vaut la peine de déplacer la fonction enregistrer dans un ngOnInit méthode.
  • J'ai mis à jour ma question parce que l'original était trop ambiguë inutiles codes. Désolé pour ça.
InformationsquelleAutor aszidien | 2018-03-23