2016-10-11 12 views
1

私は現在、角2とRxJSを学んでおり、おそらくこれはおそらく最も単純な質問であると感じています。私はストアを使用して 'ユーザー'を保存しています。私はこれが空であるかどうかを確認するために、角型テンプレートではなくTypescript側からテストします。RxJS - 空の観察可能な配列のテスト

以下は、関連するコード行です。私は長さを試してみました

public users: Observable<User[]>; 
public store: Store<AppState>; 

this.users = this.store.select(state => state.user); 

if(!this.users) { 
//DO THIS 
} 

、== nullは、==未定義と、この一見基本的な状態をテストする方法を見つけることができません。どんな助けもありがたい。

ストアへのユーザーの保存と取得が正しく機能していることに注意してください。

+2

this.usersが観測可能です。これは潜在的に非同期です。 'if(!this.users)... 'として使うことはできません。 'this.users.subscribe(users => {if(!users.length)...})'でなければなりません。 – estus

答えて

2

Storeが指示どおりに動作すると仮定すると、Observableを返します。したがって、受け取るもの(this.users)は実際にはストアの値ではなく、その値を出力するストリームです。

したがって、値が空であるかどうかをテストするには、ストリーム自体をテストしないでください。むしろ、あなたがストリームにサブスクライブして出てくるものを守ってください。

public users: User[]; 

// subscribing will actually trigger the fetch for user data 
this.store.select(state => state.user) 
      .subscribe(data => this.onUsersEmitted(data)); 

// executed once user data arrives from the store 
public onUsersEmitted(data:User[]){ 
    this.users = data; 
    if(!data || !data.length){ /*empty data arrived*/} 
} 
+0

ありがとうございます。 Observablesのグリップをもっと良くする必要があることは明らかです。 1つは、if節が機能しなかったことです。検査中データは空の配列でした。私はこれを使って働いた。 if(this.users.length == 0){ – Billyhomebase

+0

@Billyhomebaseはフィードバックに感謝します。私の答えは私のやり方で更新されました – BeetleJuice

1

これは私が問題にこのことができます

public users: Observable<User[]>; 
public store: Store<AppState>; 

this.store.select(state => state.user) 
    .map(users => users.length > 0) 
    .filter(usersPresent => usersPresent === false) 
    .subscribe(() => { 
    // DO THIS 
    }); 

希望を解決しようとする方法です。

関連する問題