Хотите вернуть новую наблюдаемую с конвейером, с новыми данными, передаваемыми каждый раз. С угловой 6 - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть метод get, который извлекает данные из API со значениями, которые меняются каждую минуту. Эти данные необходимо умножать на статические данные каждую минуту и ​​отображать обратно пользователю. Я решил использовать канал для обработки этой транзакции, так как эти данные будут часто использоваться в самом приложении.

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

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

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  constructor(private service: AppService,private http: HttpClient) {}
  private fetchDataTemp$: Observable<any>;

  private killTrigger: Subject<void> = new Subject();

  private refreshIntervalTemp$: Observable<any> = timer(0, 60000)
    .pipe(
      // This kills the request if the user closes the component 
      takeUntil(this.killTrigger),
      // switchMap cancels the last request, if no response have been received since last tick
      switchMap(() => this.fetchDataTemp$),
      // catchError handles http throws 
      catchError(error => of('0'))
   );

  getData() {
    return this.http.get("https://jsonplaceholder.typicode.com/posts/42")
      .pipe(
        retry(3),
        share()
      );
  }

  public tempdata$: Observable<any> = this.refreshIntervalTemp$;
  fakedata = [1,2,3];

  ngOnInit() {  
    this.fakedata.forEach(element => {
      this.tempdata$.subscribe(data => { console.log(data,"test"); }); 
      console.log(element);  

      this.fetchDataTemp$ = this.getPrice().pipe(
        map(
          (response) => {
            console.log(element*response.id as number)
            return response.id;
          },
          share()
        )
      ); 
    });
  }
}

Код выше очень похож на сценарий того, чего я хочу достичь. fakedata - это данные, передаваемые в канал, а foreach - это цикл ngFor, работающий с асинхронностью. URL https://jsonplaceholder.typicode.com/posts/42 в этом случае возвращает статические данные, поэтому я могу поддерживать согласованность данных response.id is 42. при запуске этого кода результаты

1
2
3
126 test 
126 test 
126 test  

То, что я ожидаю, это

 1
 2
 3
 42 test
 84 test
 126 test

Я точно определил проблему с map(), но я не знаю, как заставить карту обрабатывать значения по одному и возвращать их соответственно.

Заранее спасибо!

...