2017-01-18 11 views
2

Say мы получаем массив категории как JSON:Должен ли я «думать» обо всех моих данных как потоках при работе с Observables?

[ {id: "111", name: "cat1"}, {id: "222", name: "cat2"}, {id: "333", name: "cat3"} ] 

метод получает его:

getCategories(): Observable<Array<Category>> { 
    return this.http.get('/categories').map(data => data.json()); 
} 

Мы также имеем:

getCategoryById(id): Observable<Category> { 
    return this.getCategories() 
     .map(categories => categories.find(c => c.id === id)); 
} 

Это работает, но мне интересно, если Я использую наблюдаемые правильно.
Должен ли я считать свои категории потоком вместо атомной группы данных?

Код будет:

getCategoriesAsStream(): Observable<Category> { 
    return this.http.get('/categories') 
     .map(data => data.json()) 
     .flatMap(categories => Observable.from(categories)); 
} 

getCategoryById(id): Observable<Category> { 
    return this.getCategoriesAsStream() 
     .find(category => category.id === id); 
} 

Поскольку наблюдаемые/RxProgramming, кажется, новый способ мышления асинхронных операций, я чувствую, что я должен думать, как все потоки. Но я также опасаюсь некоторых подводных камней, которых я не видел сейчас.

Вы знаете, что бы это было? Считаете ли вы, что это слишком сложно переосмыслить мои данные таким образом?

+0

https://s3.amazonaws.com/media-p.slid.es/uploads/263775/images/1763829/687474703a2f2f692e696d6775722e636f6d2f4149696d5138432e6a7067.jpeg – olivarra1

+0

Дела в том, что это действительно зависит от случая .. Там нет действительного ответа на этот вопрос, я думаю ... Обычно, если у меня есть определенный набор категорий, я бы определил их поток как «группу объектов», и каждое новое уведомление в потоке было бы изменением во всем наборе. Но в других случаях имеет смысл поддерживать поток как отдельные объекты, такие как события, уведомления и т. Д. – olivarra1

ответ

0

Вы совершенно правы. Для меня Observables являются «как потоки», мы можем фильтровать их, сквошать их и т. Д.

Вам нужно помнить одну вещь. При использовании наблюдаемых с angular2, ваш второй пример может принести вам некоторые проблемы:

Представьте себе следующий шаблон:

<ul> 
    <li *ngFor="let category from (getCategoriesAsStream() | async)">{{category}}</li> 
</ul> 
<!--- async pipe is preferable way to bind observables in template, ie they unsubscribe automatically ----> 

данный шаблон будет оказывать только один элемент, вместо трех, которые вы получили в формате JSON.

Заключительный, observables следует рассматривать как потоки пучков.

 Смежные вопросы

  • Нет связанных вопросов^_^