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: は、サブスクリプションと観測上に読み込みます。
感謝をお試しください! これは答えになりますが、コンソールは 'storeToken'は関数ではないと言っています-_- – pingo
' res:Response'と何か関係がありますか?体をやりたければ、私はどうしたらいいですか?それ以前にもエラーが発生していました:/ – pingo
実際に、この問題は、 'map'が変換されたものを返すと仮定していると思います。たとえば、 'map'を普通に呼び出すと、' subscribe'を連鎖させることができ、それは 'observable'ではなくマップされたオブジェクトを与えます。 –