обновить значение в подписке - PullRequest
0 голосов
/ 15 января 2019

У меня сервисный периодический вызов API, который изменяет URL-адрес, если он вызывается впервые.

Он имеет интервальную подписку для генерации вызова API, я не могу использовать глобальную переменную, потому что это сервис, который может быть вызван без удаления инжектора.

getData(init: boolean): Observable<any> {

   const refreshInterval = 5000;
   const interval = observableInterval(refreshInterval).pipe(startWith(0)) 

  return interval.pipe(
    flatMap(() => this.http.get<any>(this.getUrl(init))), 
    map((data) => this.doWhateverWithData(data)),
  );

}

getUrl(init: boolean): string {

    return init ? url1 : url2;
}

Моя проблема в том, что init не меняется, и поэтому URL тоже.

Как я могу это решить?

Как я уже сказал, я не могу использовать this.init из-за своего кода.

Ответы [ 3 ]

0 голосов
/ 16 января 2019

В rxjs @ 6 вы можете использовать как отдельную функцию:

import {from} из 'rxjs'; См. Также руководство по переходу на rxjs6

https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths

UPDATE

Вам нужно переключиться на синтаксис канала, убедитесь, что вы импортируете все операторы, используемые из rxjs / operator. Например:

import {map, filter, catchError, mergeMap} из 'rxjs / operator';


getDataListApi () { вернуть this.http.get ("/ api / method") трубы ( карта ((данные: любые []) => { this.products = data; // здесь вы можете обновить ваши данные как ваше требование вернуть истину; }), catchError (error => { return throwError («Что-то пошло не так!») }); ) }

0 голосов
/ 16 января 2019

Я решаю это. Просто нужно изменить начало в интервале и проверить значение в flapMap

getData(): Observable<any> {

   const refreshInterval = 5000;
   const interval = observableInterval(refreshInterval).pipe(startWith(-1)) 

   return interval.pipe(
      flatMap((index) => this.http.get<any>(this.getUrl(index))), 
      map((data) => this.doWhateverWithData(data)),
  );

}

getUrl(index: number): string {

   return (index === -1) ? url1 : url2;
}
0 голосов
/ 15 января 2019

Ваш вариант использования немного особенный, но если вы действительно хотите изменить переменную во время потоковой подписки, вы можете использовать BehaviorSubject с withLatestFrom

init$=new BehaviorSubject('initialvalue');
getData(init: boolean): Observable<any> {

   const refreshInterval = 5000;
   const interval = observableInterval(refreshInterval).pipe(startWith(0)) 

  return interval.pipe(
    withLatestFrom(init$),
    flatMap(res=>this.apiSql.get<any>(this.getUrl(res[1]))), 
    map((data) => this.doWhateverWithData(data)),
  );
}

Вы всегда можете изменить кэшированное значение init $ на init$.next('new value')

...