2016-03-27 4 views
1

Ich habe Anmeldeformular und ich muss dieses Formular mit csrf Token senden, die ich erhalten sollte, bevor das ausgefüllte Formular gesendet wird. Es gibt keinen funktionierenden Code, aber es hat eine Idee was ich will.Holen Sie http Daten vor dem Senden http Anfrage in Angular 2 mit RxJS

var model = { 
      username : this.form.value.username, 
      email : this.form.value.email, 
      password_second : this.form.value.password_second, 
      password : this.form.value.password, 
      csrf : '' 
     }; 
     this._csrfService.getToken().subscribe(
      csrf => model.csrf, 
      error => console.log(error) 
     ); 
     this._signUpService.sendForm(model) 
      .subscribe(
       hero => console.log(hero), 
       error => console.log(error)); 

Registrierungs- und CSRF Dienstleistungen liegen auf der Hand:

getToken() 
    { 
     console.log(this.http.get(this._sighUpUrl)); 
     return this.http.get(this._sighUpUrl) 
      .map(res => res.json().data.csrf) 
      .catch(this.handleError) 
    } 

sendForm(name:Object) 
    { 
     let body = JSON.stringify(name); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let options = new RequestOptions({ headers: headers }); 
     console.log(this.http.post(this._sighUpUrl, body, options)); 
     return this.http.post(this._sighUpUrl, body, options) 
      .map(res => res.json().data) 
      .catch(this.handleError) 
    } 

Wie warten, während ich CSRF-Token nicht bekommen?

+0

senden Sie einfach die zweite Anfrage aus dem Rückruf der ersten –

+0

Ich habe keinen Zugriff auf "diese" vom Rückruf – x1site

+0

Warum haben Sie keinen Zugriff darauf? –

Antwort

2

Sie könnten nur die zweite Anforderung von dem Rückruf der ersten senden die Zusammensetzung Betreiber von Observablen:

var model = { 
    username : this.form.value.username, 
    email : this.form.value.email, 
    password_second : this.form.value.password_second, 
    password : this.form.value.password 
}; 
this._csrfService 
    .getToken() 
    .map(csrf => Object.assign({csrf:csrf}, model)) 
    .flatMap(model => this._signUpService.sendForm(model)) 
    .subscribe(
    hero => console.log(hero), 
    error => console.log(error) 
); 
+0

Danke, zweite funktioniert – x1site

+0

wird besser sein, 'flatMapLatest' (' switchMap' in Rx5) anstelle von 'flatMap' zu verwenden – xgrommx

1

Sie könnten den flatMap Betreiber von Observablen verwenden, wie unten beschrieben:

var model = { 
    username : this.form.value.username, 
    email : this.form.value.email, 
    password_second : this.form.value.password_second, 
    password : this.form.value.password, 
    csrf : '' 
}; 
this._csrfService.getToken().subscribe(
    csrf => { 
     model.csrf = csrf; 
     this._signUpService 
     .sendForm(model) 
     .subscribe(
      hero => console.log(hero), 
      error => console.log(error) 
     ); 
    }, 
    error => console.log(error) 
); 

Oder viel besser zu nutzen:

getToken().flatMap(token => { 
    return sendForm(...); 
}).subscribe(...);