2016-11-21 24 views
0

In meinem Code beobachtbare Ursache Fehlern zurückgegeben habe ich benutzerdefinierte post-Methode, die die HTTP-Klasse von Winkel 2.enVerwendung von Versprechen in Methode

post(url: string, body: string, options?: RequestOptionsArgs): Observable<any> { 

     if (!this._gs.externalRequest) { 
      let that = this; 
      this._gs.getToken().then((token) => { 
       if (token) { 
        options = this.prepareOptions(options, token); 
       } 
       return that.sendPostRequest(url, body, options); 
      }); 
     } 
     else { 
      this._gs.externalRequest = false; 
      return this.sendPostRequest(url, body, options); 
     } 
    } 

In obiger Code post-Methode Extents gibt eine beobachtbare während des Verfahrens dies. _gs.getToken() in If-Bedingung liest Token aus dem lokalen Speicher ein asynchroner Aufruf und gibt eine Zusage zurück.

Obwohl die Zusammenstellung einen Fehler doenst erzeugen, aber, wenn ich Zugriff auf

this.http.post ('/ api/myFormHandler', this.form.value) .subscribe ((Daten) => { });

class MyFormComponent- inline template:16:29 caused by: Cannot read property 'subscribe' of undefined 
+0

Übrigens müssen Sie 'that = this' nicht verwenden, wenn Sie fette Pfeilfunktionen verwenden. – hgoebl

+1

'if (! ...) {...}' gibt nichts zurück. – hgoebl

Antwort

1

Aufgrund der asynchronen Natur des JS gibt Ihre erste Bedingung nicht die richtige Sache zurück. Um die Methode Observable<any> von der post-Methode zurückzugeben, sollten Sie den Körper Ihrer ersten if ändern, um mit zwei Observablen zu arbeiten, die voneinander abhängen.

// sample 
const getToken = Promise.resolve('token'); 
const resolveToken = Rx.Observable.fromPromise(getToken); 

... 
if (!this._gs.externalRequest) { 
    return resolveToken 
    .flatMap(token => { 
     if (token) { 
      options = this.prepareOptions(token); 
     } 
     return this.sendPostRequest(url, options); 
    }) 
} 
... 
this.post.subscribe(console.log); 

Erstens haben Sie Ihr Token ein Verfahren zum Zurückkehren zu einem beobachtbaren und dann flatMap es zu werfen, wie wir dieses Ergebnis in einem zweiten beobachtbaren müssen.

Bitte beziehen Sie sich auf diesen Artikel - combining observables.

Verwandte Themen