2017-05-18 20 views
0

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; 
    }); 

それはまた、右感じることはありません。

誰かが私にベストプラクティスをアドバイスしてくれますか?

答えて

0

のようなものを試してみてください:トッドのモットーは、Twitter経由で良い例を与えた

login(username: string, password: string): Observable<User> { 
    let o = this.http 
     .post('/api/users/login', { username: username, password: password}) 
    //uncomment if you have multiple subscribers, otherwise http request is executed multiple times 
     //.share() 
    ; 

    o.subscribe(
     (response: Response) => { 
      this.user = loginResult.user as User; 
      localStorage.setItem(tokenStorageName, loginResult.token); 
     }, 
     (response: Response) => this.handleError(response) 
    ); 

    return o.map(response: Response => response.json()); 
} 
+0

share()は一般的に考えられているか、いくつかの問題を解消しますか?オブザーバブルの原則は? LoginSerponentとAuthenticationServiceの間にUsersServiceを配置し、AuthenticationServiceからのオブザーバブルを解決してそこにキャッシングを行う代替のアプローチがあると思います。しかしこれは少し上にあるようですね? –

+0

両方のソリューション( 'do()'と 'share()')については、RxJsのドキュメントを参照してください:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share。 md –

+0

申し訳ありませんが、5分だけのコメントを編集できます... 私の場合、私はそれぞれのリクエストに対して 'showLoader()'を行います。すべてのCRUDリソースには、成功とエラーハンドラが共有されています。しかし、各CRUDコンポーネントは独自の成功とエラーハンドラを持つことができます。私が 'shared'と' specific'ロジックのために 'subscribe()'を2回実行すると、少なくとも 'showLoader()'が2回実行されます。 複数の 'do()'を使ってコードできることは確かですが、なぜ自分自身を制限する必要がありますか? –

関連する問題