2016-05-19 16 views
0

Angular 2のドキュメントでは単純なパターンに従おうとしていますが、機能を実行するのは難しいです。Observables with Angular 2/Typescriptのマルチステップ関数

私はから働いている例は​​(アプリ/ TOH/hero.service.ts(観測可能ベース)ファイル)である:私はextractData機能の後にトークンを保存する必要がありますが、やる

getHeroes(): Observable<Hero[]> { 
    return this.http.get(this.heroesUrl) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 
    addHero (name: string): Observable<Hero> { 
    let body = JSON.stringify({ name }); 
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.post(this.heroesUrl, body, options) 
        .map(this.extractData) 
        .catch(this.handleError); 
    } 
    private extractData(res: Response) { 
    let body = res.json(); 
    return body.data || { }; 
    } 
    private handleError (error: any) { 
    // In a real world app, we might use a remote logging infrastructure 
    // We'd also dig deeper into the error to get a better message 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Observable.throw(errMsg); 
    } 

私が正しいと呼んでいるとは思わない。私はextraData機能でそれを置くとき、私はそれが仕事を得るが、私はそれはそれ自身の上で動作するようにしたいと思い:

private extractData(res: Response) { 
    let body = res.json(); 
    if (body.response.user) { 
     return this.storeToken; 
    } 
    } 
    // want to call this function, but i'm doing something wrong 
    private storeToken(res: Response) { 
    let resp = res; 
    console.log("resp", resp); 
    this.userId = resp.user.id; 
    this.token = resp.user.authentication_token; 
    localStorage.setItem('userId', this.userId); 
    localStorage.setItem('token', this.token); 
    return Rx.Observable.of('token', 'userId'); 
    } 
    private handleError (error: any) { 
    // In a real world app, we might use a remote logging infrastructure 
    // We'd also dig deeper into the error to get a better message 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.error(errMsg); // log to console instead 
    return Rx.Observable.throw(errMsg); 
    } 

私はどのようなデータがreturn this.storeToken関数に渡されている場合はわからない、と私はstoreTokenオペレータ(res: Response)でそれを呼び出す方法がわかりません。

私はこれが非常に基本的だと感じていますが、私はそれにぶら下げられているので、どんな助けも大歓迎です!ありがとうございました!

編集: この機能は動作しますが、私は2つに分離したいと思います:

private extractData(res: Response) { 
    let body = res.json(); 
    if (body.response.user) { 
     this.userId = body.response.user.id; 
     this.token = body.response.user.authentication_token; 
     console.log("id:", this.userId); 
     console.log("token:", this.token); 
     localStorage.setItem('userId', this.userId); 
     localStorage.setItem('token', this.token); 
     return Rx.Observable.of('token', 'userId'); 
    } 
    } 

編集2: は、サブスクリプションと観測上に読み込みます。

答えて

0

メソッドの呼び出しではなく、その署名を返す必要があるようですか?代わりに

private extractData(res: Response) { 
    let body = res.json(); 
    if (body.response.user) { 
     return this.storeToken; 
    } 
    } 

は、応答のために、この

private extractData(res: Response) { 
    let body = res.json(); 
    if (body.response.user) { 
     return this.storeToken(res); 
    } 
    } 
+0

感謝をお試しください! これは答えになりますが、コンソールは 'storeToken'は関数ではないと言っています-_- – pingo

+0

' res:Response'と何か関係がありますか?体をやりたければ、私はどうしたらいいですか?それ以前にもエラーが発生していました:/ – pingo

+1

実際に、この問題は、 'map'が変換されたものを返すと仮定していると思います。たとえば、 'map'を普通に呼び出すと、' subscribe'を連鎖させることができ、それは 'observable'ではなくマップされたオブジェクトを与えます。 –

関連する問題