C#とAngular1コードの作成経験はありますが、Angular2 +とRxJsは新しいものです。Angular4 Httpの処理に関するベストプラクティス
私はちょうどAngular4ログインコンポーネントを書いたことがあり、loginメソッドの結果をobservableのマップ関数にキャッシュすることでコードの匂いを書いたように感じます。
私はLoginComponentは上のログインを呼び出しAuthenticationService持っている:私の知る限り承知しているとしてだけですべきことであるが、ので、それはマップ機能の状態を保存するために奇妙な感じ
login(username: string, password: string): Observable<User> {
return this.http
.post('/api/users/login', { username: username, password: password })
.map((response: Response) => {
let loginResult = response.json();
this.user = loginResult.user as User
localStorage.setItem(tokenStorageName, loginResult.token);
return this.user;
})
.catch(this.handleError);
}
を翻訳機能。私はユーザーとトークンをキャッシュして、ログイン結果から戻ってきて、ユーザーデータが必要な場合に別のサービスコールを行う必要はありません。ここで
は、ログインコンポーネントのロジックです:LoginComponentはAuthenticationServiceまたはUserCacheにSETUSERを呼び出すようにするために
login() {
this.isLoading = true;
this.authenticationService.login(this.model.username, this.model.password)
.subscribe(
result => {
let returnUrl = this.activatedRoute.snapshot.queryParams['returnUrl'] || '/'
this.router.navigate([returnUrl]);
}, error => {
if (error != null && error.code == unauthorizedCode) {
this.error = 'Username or password incorrect';
}
else {
this.error = 'Error logging in';
}
this.isLoading = false;
});
それはまた、右感じることはありません。
誰かが私にベストプラクティスをアドバイスしてくれますか?
share()は一般的に考えられているか、いくつかの問題を解消しますか?オブザーバブルの原則は? LoginSerponentとAuthenticationServiceの間にUsersServiceを配置し、AuthenticationServiceからのオブザーバブルを解決してそこにキャッシングを行う代替のアプローチがあると思います。しかしこれは少し上にあるようですね? –
両方のソリューション( 'do()'と 'share()')については、RxJsのドキュメントを参照してください:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share。 md –
申し訳ありませんが、5分だけのコメントを編集できます... 私の場合、私はそれぞれのリクエストに対して 'showLoader()'を行います。すべてのCRUDリソースには、成功とエラーハンドラが共有されています。しかし、各CRUDコンポーネントは独自の成功とエラーハンドラを持つことができます。私が 'shared'と' specific'ロジックのために 'subscribe()'を2回実行すると、少なくとも 'showLoader()'が2回実行されます。 複数の 'do()'を使ってコードできることは確かですが、なぜ自分自身を制限する必要がありますか? –