2017-11-13 1 views
-2

Ich habe eine Komponente Klasse und Service-Klasse. Ich habe die Logik, ein Flag zu spiegeln, wenn http 200 Statuscode empfangen wird. Basierend auf der erhaltenen Antwort drehe ich die Flagge mit einer if-Bedingung.Wann ist abonnieren Methode von Angular Http Modul

Requests(data:Array<String>):Observable<any>{ 
    return this.http.post(this.Url,data) 
     .map(
     (res:Response) => { 
      if(res.status === 200 || res.status===201) { 
      return res.json() 
      } 
     } 
    ) 
     .catch((error:any) => Observable.throw(error.json().error || 'Server error')); 

    } 

Die Komponentendatei geht so.

Also basierend auf der Antwort von Service erhalten, werde ich die Flagge umdrehen.

Aber wenn ich meinen Code in Debugger-Tools ausführen, wird die Logik zum Umdrehen des Flags nie aufgerufen, auch wenn ein Wert in rResponse-Variable ist. Wenn die Funktion methodenname aufgerufen wird, versucht der Codefluss den Wert von rResponse unter der ersten if-Schleife zu prüfen und ruft dann am Ende die subscribe-Methode auf.

Wenn Sie bitte vorschlagen, den Fluss, in dem Subscribe-Methode funktioniert. Warum wird die if-Bedingung aufgerufen, bevor die eigentliche subscribe-Methode aufgerufen wird?

Dies ist kein Duplikat, weil ich verstehen will, warum der Fluss nicht zu meiner if-Schleife geht. Es gibt nichts undefiniertes. Ich bekomme Werte aus dem Service

+0

Mögliche Duplikat [beobachtbare undefiniert] zuweisen (https://stackoverflow.com/questions/41945817/observable -undefined) – jonrsharpe

+0

Die Subscribe-Methode wird sofort aufgerufen. Der * Callback, den Sie an ihn übergeben, ist das nicht, das ist der springende Punkt bei der asynchronen Bearbeitung von Anfragen. – jonrsharpe

Antwort

0

Was ich verstehe, ist, dass Sie einige Logik nach Erhalt Wert in rResponse tun möchten.

Wie Sie vielleicht wissen, ist der subscribe-Methodenaufruf von Natur aus asynchron, d. H., Sobald eine Anfrage gemacht wurde, wird die Ausführung mit den nächsten Zeilen fortgesetzt.

Also, wie Sie geschrieben haben, wenn Bedingung außerhalb Subscribe-Methode, wenn Bedingung unmittelbar vor Abschluss des Service-Aufrufs ausgeführt wird. Was zu einer leeren Antwort führt.

So müssen Sie die, wenn die Bedingung in dem gleichen Block platzieren, wo Sie die this.rResponse = Response;

methodName (selectedData) {  
    this.service.Requests(Id).subscribe((Response => { 
     this.rResponse = Response; 
     if(this.rResponse) { 
      // My logic to flip the flag 
     }  
    }));   
}