2016-02-02 4 views
1

Я думаю, что я принципиально не понимаю концепцию rxjs наблюдаемых с угловыми 2.Как заменить HTTP наблюдаемым на новые наблюдаемые?

Я создаю наблюдаемое свойство, которое другие могут подписаться и получить данные для результата http-вызова.

Что делать, если я хочу сделать еще один http-запрос, возможно, с некоторыми измененными параметрами, чтобы отменить некоторые новые данные? Я просто заменяю наблюдаемое на это новое наблюдаемое? Означает ли это нарушение подписки моих подписных компонентов с предыдущим наблюдаемым?

ответ

3

Отказ от ответственности: Я не использовал angular2, но довольно часто использую RxJS.

Я могу сказать, что, как правило, дело в том, что для вещей с одним выстрелом, таких как HTTP-запрос, созданный Observable будет получать только один результат от этого запроса. Если вы хотите сделать больше запросов, вам нужно будет снова вызвать метод. т.е.

From the docs

$http.get('/people.json').map(res => res.json()).subscribe(people => this.people = people); 

Теперь, если вы планируете сделать несколько последующих запросов, то обычно вы будете инициировать вызов с каким-либо другим событием, может быть, пользовательское событие или событие в сети, вы можете даже установить его до Периодически запускайте каждую пару секунд. Чтобы не «сломать цепочку», вам нужно будет использовать один из вариантов flatMap (который в основном .map().merge()), чтобы выровнять результаты в одну цепочку.

Например, если у вас произвольное событие (синтаксис примечания может немного отличаться, как есть несколько версий RxJS там):

Rx.Observable.fromEvent($someButton, 'click') 
      //Gather the parameters for the request 
      .map(e => {id : 'abc123'}) 
      //Flatten each request into a single stream so the observer 
      //never knows the difference 
      .flatMap(params => $http.get(`/people/${params.id}`), 
         (params, res) => res.json()) 
      //Do your update here 
      .subscribe(person => this.people[person.id] = person); 
Смежные вопросы