2016-10-11 3 views
1

Я изучаю Angular 2 и RxJS в настоящий момент и чувствую, что это, вероятно, самый простой вопрос. Я использую Store для сохранения «пользователей». Я хочу проверить, не является ли это пустым или нет со стороны машинописного текста, а не в шаблоне «Угловой».RxJS - Тест для пустого наблюдаемого массива

Ниже приведены соответствующие строки кода.

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

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

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

Я попытался длина == NULL == неопределенными и не может найти, как проверить для этого, казалось бы, основное состояние. Любая помощь оценивается.

Обратите внимание, что сохранение и загрузка пользователей в магазин работает правильно.

+2

это.обзор можно наблюдать. Это потенциально асинхронно. Он не может использоваться как 'if (! This.users) ...'. Это должно быть 'this.users.subscribe (users => {if (! Users.length) ...})'. – estus

ответ

2

Предполагая, что Store работает, как вы указываете, он возвращает наблюдаемый. Так что вы получаете (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. Одно дело, что предложение 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 
    }); 

Надеется, что это помогает.