2017-02-06 4 views
1

My App.component, die eine Init-Methode in meinem user service aufruft.Laden Sie Daten vor der Komponenteninialisierung - Winkel 2

ngOnInit(){ 
    this.init(true).then(data => { 
     console.log("OnInit Called") 
    })  
} 

User.service gibt ein promise was wiederum die account.init

init = (isRegistered) => { 
    return new Promise((resolve, reject) => {  
     this.account.init(isRegistered).then(data => { 
      //some data inialization 
      console.log("OnInit Called User Service")    
     });   
    }); 
} 

nennt Account.service ein Versprechen gibt, die mit Observable .forkJoin

init = ((userType: boolean) => { 
    return new Promise((resolve, reject) => { 
     Observable.forkJoin([ 
      this.m1, 
      this.m2]).subscribe(data => { 
       //persist those return data 
      });   
    }); 
} 
  1. Warum mehrere Dienste ruft beide Konsole. Protokollanweisungen nie wird ausgeführt?
  2. Warum verhindert es nicht die Komponenteninialisierung, bevor das Observable.forkJoin seine Serviceaufrufe abschließt?

Antwort

2
  1. (und 2.) rufen zu resolve(...) fehlt
init = (isRegistered) => { 
    return new Promise((resolve, reject) => {  
     this.account.init(isRegistered).then(data => { 
      //some data inialization 
      console.log("OnInit Called User Service")    
      resolve(/*someValue */); // <<<== missing 
      // or reject(/* someValue */); 
     });   
    }); 
} 
  1. Warum erwarten Sie es, alles zu blockieren? ngOnInit() kann nicht blockiert werden. Sie können beispielsweise *ngIf verwenden, um nichts anzuzeigen, bevor die Daten noch nicht verfügbar sind. Sie können auch einen Router Guard verwenden, um die Erstellung von Komponenten zu verhindern, bevor Daten verfügbar sind. https://angular.io/docs/ts/latest/guide/router.html#!#resolve-guard Aber es gibt keine Möglichkeit, die Ausführung in JS in irgendeiner Weise zu blockieren.
+0

Sie sind wie immer richtig, aber tatsächlich können Sie einen synchronen Serveraufruf machen, so ist es möglich, die Ausführung zu blockieren :) Es ist sinnlos, aber es ist möglich – smnbbrv

+0

Ok, ich nahm an, dass veraltet war, aber es ist noch fraglich wenn Das blockiert die Ausführung wirklich. Es besetzt nur den UI-Thread - eine for-Schleife könnte das Gleiche tun, aber wie Sie sagten - ziemlich sinnlos: D –

+0

:) for-Schleife kann die Ausführung blockieren, aber es wird nie in der Lage sein, ein asynchrones Ergebnis zu erhalten, weil Es wird in die Ereigniswarteschlange verschoben. Die einzige Möglichkeit, die Ausführung zu blockieren, bis async Response empfangen wird, wäre entweder ein ES6 Generator oder async/awa ... Immer noch sinnlos: D – smnbbrv

2

Sie müssen das Versprechen definitiv zuerst auflösen.

init = (isRegistered) => { 
    return new Promise((resolve, reject) => {  
     this.account.init(isRegistered).then(data => { 
      // some data initialization 
      if (data) { 
       resolve(...); 
      } else { 
       reject(...); 
      } 
      console.log("OnInit Called User Service")    
     });   
    }); 
} 

Es ist schwer zu sagen, was das Problem ist, weil wir nicht wissen, was this.m1 und this.m2 sind.

Lassen Sie sich nicht überraschen, wenn Sie forkJoin() verwenden. Dieser Operator forkJoin() gibt keinen Wert aus, wenn einer seiner Quell-Observables fehlschlägt oder keinen Wert ausgibt und vorzeitig beendet wird.