У меня есть метод 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()
, но я не знаю, как заставить карту обрабатывать значения по одному и возвращать их соответственно.
Заранее спасибо!