Я не получаю rxjs 6 с угловым 6 с интервалом, switchMap и картой

Я хочу обновить свой код rxjs до 6, я не понимаю.

Раньше у меня был следующий опрос новых данных каждые 5 секунд:

import { Observable, interval } from 'rxjs';
import { switchMap, map } from 'rxjs/operators';

var result = interval(5000).switchMap(() => this._authHttp.get(url)).map(res => res.json().results);

Теперь ... конечно, он сломан, и документация не оставляет мне места.

Как мне написать это, чтобы соответствовать rxjs 6?

Спасибо


person Tampa    schedule 06.05.2018    source источник
comment
Как это сломалось? То, что вы работали, только потому, что вы импортировали напрямую из rxjs, что неверно и импортирует все операторы прототипа, что вам не нужно, если вы позже импортируете из import { switchMap, map } from 'rxjs/operators';   -  person martin    schedule 06.05.2018


Ответы (2)


Код должен быть примерно таким. Вам нужно использовать оператор pipe.

import { interval } from 'rxjs';
import { switchMap, map } from 'rxjs/operators';

const result = interval(5000).pipe(
switchMap(() => this._authHttp.get(url)),    
map(res => res.results)
)
person siva636    schedule 06.05.2018
comment
При использовании вашего предложения возникает ошибка: [ts] Свойство 'pipe' не существует для типа 'OperatorFunction ‹{}, {}›'. - person Tampa; 06.05.2018
comment
Не забудьте добавить канал в список импорта: import {Observable, interval, pipe} from 'rxjs'; - person siva636; 06.05.2018
comment
Я думаю, this._authHttp.get (url) .pipe, а не this._authHttp.get (url)) .pipe. этот мерзавец избавился от ошибки - person Tampa; 06.05.2018
comment
Но теперь я получаю [ts] Свойство 'json' не существует для типа '{}'. для res.json () - person Tampa; 06.05.2018
comment
Новый HttpClient возвращает только данные, без ответа (если в параметрах не задано наблюдение: «ответ»). Итак, вы можете просто удалить .json () - person funkizer; 06.05.2018
comment
вероятно, вам не нужна труба (res = ›res.json (). result) - person Eliseo; 06.05.2018

После долгих исследований я смог придумать следующий обновленный подход от RxJs 6 с Angular 6.

API поиска вызывается через каждые 5 секунд и отписывается, когда количество> 5:

let inter=interval(5000)

let model : ModelComponent;
model=new ModelComponent();
model.emailAddress="[email protected]";


let count=1;
this.subscriber=inter.pipe(
          startWith(0),
          switchMap(()=>this.asyncService.makeRequest('search',model))
        ).subscribe(response => {
          console.log("polling")
          console.log(response.list)
          count+=1;
          if(count > 5){
            this.subscriber.unsubscribe();
          }
        });

Запрос API:

   makeRequest(method, body) : Observable<any> {
    const url = this.baseurl + "/" + method;

    const headers = new Headers();
    this.token="Bearer"+" "+localStorage.getItem('token'); 
    headers.append('Authorization', this.token);
    headers.append('Content-Type','application/json');

    const options = new RequestOptions({headers: headers});
    return this.http.post(url, body, options).pipe(
        map((response : Response) => {
            var json = response.json();                

           return json; 
        })
    );
}

Не забудьте отказаться от подписки, чтобы избежать утечки памяти.

ngOnDestroy(): void {
if(this.subscriber){
  this.subscriber.unsubscribe();
}

}

person Shahbaaz Khan    schedule 24.08.2018