2016-01-08 3 views
2

Должен признать, что я делаю первые шаги с Angular2, и у меня возникает проблема, и у меня возникают проблемы с пониманием. Я использую [email protected], который имеет зависимость от rxjs @ 5.0.0-b.0.Преобразование Angular2 Ответ Http на ConnectableObservable

Мое намерение - сделать HTTP-запрос (службе REST) ​​и разрешить отправку ответа нескольким подписчикам возвращаемого наблюдаемого. Если я правильно понимаю документацию, я могу использовать функцию publish() для преобразования Observable, возвращаемого, например. http.post для ConnectableObservable, зарегистрируйте несколько подписчиков, вызвав ConnectableObservable.subcribe (...) несколько раз, а затем вызовите ConnectableObservable.connect(), чтобы фактически выполнить HTTP-запрос, например. например:

var obs: Observable<Response> = this.http.post(...); 
var cobs: ConnectableObservable<Response> = obs.publish(); 
cobs.subscribe(sub1); 
cobs.subscribe(sub2); 
cobs.connect(); 

По крайней мере, мой IDE-шов согласен с этим и не показывает никаких предупреждений. Выполнение кода, я однако получаю следующее сообщение об ошибке:

EXCEPTION: Error during evaluation of "click"
ORIGINAL EXCEPTION: TypeError: obs.publish is not a function

Если я исследую obs объект в отладчике, только очень небольшое подмножество documented functions действительно доступны. Если я посмотрю на класс implementation of the Observable, только некоторые из документированных функций действительно реализованы. Большинство функций, в том числе функция publish, объявляются только как сигнатура функции без какой-либо реальной реализации.

Я делаю что-то явно неправильно здесь или я неправильно понял, как работать с наблюдаемыми RxJS?

Если это имеет значение, я строю с глотком, используя npm для разрешения и загрузки зависимостей, включая rxjs/bundles/Rx.js из моего каталога node_modules.

ответ

6

Фактически, я считаю, что использование ConnectableObservable не требуется. Вот тест, который я сделал, и оба абонента вызывается, когда будет получен ответ:

var observable = 
    this.http.get('https://angular2.apispark.net/v1/companies/') 
      .map(res => res.json()); 

observable.subscribe(
    data => console.log('subscribe #1')); 
observable.subscribe(
    data => console.log('subscribe #2')); 

Редактировать

Я думаю, что оператор share может соответствовать вашим потребностям:

var observable = 
    this.http.get('https://angular2.apispark.net/v1/companies/') 
      .map(res => res.json()).share(); 

observable.subscribe(
    data => console.log('subscribe #1')); 
observable.subscribe(
    data => console.log('subscribe #2')); 

It позволяет создать подключаемое наблюдаемое (метод share возвращает горячий наблюдаемый). В этом случае выполняется только один запрос HTTP ...

Этот вопрос может быть полезен для вас: Hot and shared Observable from an EventEmitter.

Edit1

После некоторых дискуссий в комментариях, кажется, что вопрос о том, почему возникает ошибка follwing: TypeError: obs.share is not a function и почему почти все документированные функции не доступны в наблюдаемой возвращенное функцией пост ,

Таким образом, решение заключалось в том, чтобы явно импортировать операторы RxJS, чтобы они были доступны во время выполнения.

Существует два решения.Импорт на оператор:

import 'rxjs/add/operator/map' 

Или в более общем случае, если вы хотите, чтобы все доступные методы оператора для наблюдаемых:

import 'rxjs/Rx'; 

Надеется, что это помогает вам, Тьерри

+0

Это была моей первой попыткой, но если вы видите то же поведение, что и я, используя этот код, фактический HTTP-запрос выполняется дважды - один раз для каждого абонента. Это не то, что я хотел. – jarnbjo

+0

О, боже, ты прав! –

+1

Оператор 'share', похоже, является тем, что вы ищете ;-) С его помощью выполняется только один HTTP-запрос ... –

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