2017-02-01 6 views
0

Итак, я использую Angular 2 и изо всех сил пытаюсь сделать наблюдаемый HTTP-запрос доступным для нескольких наблюдателей. В частности, я хотел бы поделиться всеми типами ответов, включая ошибки.Rxjs - Невозможно преобразовать холодный наблюдаемый в горячий

Я пробовал так:

return this._http.request(new Request(options)) 
    .map((res: Response) => this.refreshToken(res)) 
    .share() 

, а затем

this.data.request() 
    .map((response: Response) => (new financeiro.FetchCompletedAction(response))) 
    .catch((error: any) => { 
    console.log('lancamento-effects:'); 
    return Observable.of(new feedback.HttpRequestFailedAction(["Erro ao inserir lançamento"])) 
    }) 

это выше код suposed отправить действие об ошибке, в конечном счете, показывает сообщение об ошибке на экране пользователя.

На самом деле это происходит в два раза ..

enter image description here

Также печатается дважды на консоли.

enter image description here

+0

Эй. Непонятно, как организован ваш код. Ваш первый блок кода показывает тело метода 'this.data.request()'? – AngularChef

ответ

1

Вот код (Plunkr):

@Component({ 
    selector: 'my-app', 
    template: ` 
    <button (click)="subscribe()">Subscribe</button> 
    ` 
}) 
export class AppComponent { 
    obs: Observable<any>; 

    constructor(private http: Http) { 
    // Create the observable ONCE + Share. 
    this.obs = this.http.get('https://httpbin.org/get') 
     .do(() => console.log('***SIDE EFFECT***')) 
     .mapTo('***RESULT***') 
     .share(); 
    } 

    subscribe() { 
    // Subscribe to the same observable TWICE. 
    this.obs.subscribe(val => console.log('subs1', val)); 
    this.obs.subscribe(val => console.log('subs2', val)); 
    } 
} 

Вот что консоль показывает:

***SIDE EFFECT*** 
subs1 ***RESULT*** 
subs2 ***RESULT*** 

Один побочный эффект (то есть запрос HTTP), две подписки.

Это вы что искали?

0

Убедитесь, что каждый абонент подписывается на тот же горячий наблюдаемый. Каждый раз, когда вы звоните:

return this._http.request(new Request(options)) 
    .map((res: Response) => this.refreshToken(res)) 
    .share() 

Вы создаете новый горячий наблюдаемый от наблюдаемого холода.

Пример предполагая, приведенный выше код, завернутый в функции называется Foo(): Если вы сделаете следующее, вы создадите 2 горячие наблюдаемые и 2 HTTP запросов:

foo().subscribe(...) 
foo().subscribe(...) 

Принимая во внимание следующее будет создавать только один разовый горячий наблюдаемый (и один запрос http):

let hotObs = foo(); 
hotObs.subscribe(...) 
hotObs.subscribe(...);