2016-09-30 5 views
0

Ich habe einen Guard, der eine bestimmte Route schützt. In der canActive Methode muss ich zwei HTTP-Anfragen machen, bei denen die zweite auf der Grundlage der Antwort des ersten ausgelöst wird. Die zweite Anfrage wird jedoch nie gemacht und ich nehme an, dass es sich um das verschachtelte Konstrukt von wiederkehrenden Observablen handelt.Angular2: Nested Observables in Guard

1 canActivate(route: ActivatedRouteSnapshot, 
2   state: RouterStateSnapshot) : Observable<boolean>|boolean { 
3 return this.provider.getA().map(
4 dataA => { 
5  return this.provider.getB().map(
6  dataB => { 
7   return (dataB.allowed); 
8  } 
9  ); 
    } 
    ); 
} 

Sowohl getA() und getB() geben die folgenden:

getA() : Observable<any> { 
    return this.http.post(URL,payload). 
        map(response => response.json()); 

};

Der Code ist vereinfacht, aber Sie können davon ausgehen, dass getA() und getB() ordnungsgemäß funktionieren. getA() wird über das Netzwerk gesendet, wenn der Guard aufgerufen wird, obwohl getB() niemals gesendet wird. Der Debugger verlässt leise in Zeile 5

Eine weitere Sache, Typoskript zeigt eine Warnung, dass ich wahrscheinlich schon Lösung sagt, aber ich bin zu sehr ein Noob mit Observable insbesondere zu wissen, was damit zu tun:

Observable<Observable<boolean>>' is not assignable 
to type 'Observable<boolean>' 

Um eine Vermutung, das Konstrukt der Observables nie verrechnet, deshalb gibt es keine Warnung und ich warte bis zum Ende der Zeit. Meine naive Vorstellung war, dass, solange irgendein Observable einen booleschen Wert zurückgibt (wie in Zeile 7 getan), der Teilnehmer wissen würde, wie er damit umgehen soll.

Ich bin glücklich, Ihre Hinweise zu lesen. Ab ins Bett ...

Antwort

1

Sie switchMap hier verwenden sollten:

return this.provider.getA().switchMap(
    dataA => { 
    return this.provider.getB().map(
     dataB => { 
     return (dataB.allowed); 
     } 
    ); 
    } 
); 

In Ihrem Code, erstellen Sie eine beobachtbare von Observablen. switchMap flacht diese Struktur ab und emittiert die emittierten Elemente von B bis A.

+0

Das ist es. Ich schätze, ich setze mich hin und gehe zum vollständigen Observables-Tutorial. – Matt

+1

Go for it. Es ist unglaublich, was man mit ihnen machen kann. Schauen Sie sich 'RX Murmeln' an! – j2L4e

Verwandte Themen