2016-02-14 3 views
2

Можно ли назвать Subscribe способ 2 раза?Angular2 Http double subscribe

Я пытаюсь построить фабрику api, которая сохраняет данные на заводе, но эти данные могут использоваться разными компонентами для каждого вызова ajax.

завод

export class api { 

    result = []; 

    constructor (protected http: Http) { } 

    getData() 
    { 
     return this.http.get('./friends.json').map((res: Response) => res.json()).subscribe(res => this.result = res); 
    } 
} 

тест компонент, который звонит subscribe метод снова

export class TestPage { 

    showListResult; 

    constructor (protected api: api) { 

     this.api.getData().subscribe(res => this.showListResult = res) 
    } 

} 

ответ

1

Вы можете вернуть новый Observable обертку. Нечто подобное должно работать:

import {Observable} from 'rxjs/Observable' 

export class api { 

    result = []; 

    constructor (protected http: Http) { } 

    getData() { 
     return new Observable(observer => { 
      this.http.get('./friends.json') 
       .map((res: Response) => res.json()) 
       .subscribe(res => { 
        this.result = res; 
        observer.next(res); 
        observer.complete(); 
       }); 
     }); 
    } 
} 
+0

Удалить часть доли и проверить мой ответ. Точка в использовании 'new Observable' и' observer.next (res); '. – dfsq

+0

Пример, который я написал, как это должно быть. Убедитесь, что вы импортируете Observable. – dfsq

+0

Что такое 'observer.next (res);' и 'observer.complete();' do? – Basit

1

Если вы хотите сделать запрос HTTP один раз, и разделить результат на несколько абонентов, то я предлагаю использовать подсоединяемый наблюдатель, который публикует и повторы последнее значение излучаемого:

this.observable = http.get('...').map(t=> t.json()).publishReplay().refCount(); 

Каждый новый абонент будет воспроизводить последнее испущенное значение без запроса нового HTTP-запроса.

Demo Plnkr

Этот ответ похож на этот SO question and answer.

+0

Спасибо за этот комментарий - я удалил ответ, потому что это явно неправильно. Теперь, чтобы прорыть какой-то код, я думал, что он работает правильно ... –

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