У меня есть проблема с темой, что когда я запускаю его один раз, он работает просто замечательно, но когда я изменяю его так, как он, d ie где-то
, а также я пытаюсь активировать какой-то таймер, который также никогда случилось.
код на моем gitHub
- это сервис, который я использую при вызове метода requestNewStock
import { Injectable } from "@angular/core";
import {
tap,
switchMap,
timeInterval,
mergeMap,
find,
delay,
bufferCount,
distinctUntilChanged,
timeout,
publish,
exhaustMap,
take,
concatMap,
repeat,
catchError
} from "rxjs/operators";
import { Stock } from "../models/stock.model";
import { StockStore } from "../store/stock.store";
import {
Subject,
BehaviorSubject,
of,
Observable,
from,
interval,
forkJoin,
ConnectableObservable,
race
} from "rxjs";
import { StockQuery } from "../queries/stock.query";
import { RequestPollService } from "./request-poll.service";
@Injectable({ providedIn: "root" })
export class StockService {
private refreshRate: number;
private updateStateArr: Set<string>;
private stocks: string[] = [];
private notifyStockFetching$: Subject<null> = new Subject<null>();
constructor(
private stockStore: StockStore,
private stockQuery: StockQuery,
private requestPollService: RequestPollService
) {}
handleStocks(): Observable<void> {
return this.notifyStockFetching$.pipe(
find(() => this.stocks.length > 0),
mergeMap(stocks => this.handleStockFetchingData()),
catchError(err => {
console.log(err);
return of([])
}),
delay(this.refreshRate),
repeat()
);
}
getStocks(): Observable<Array<Stock>> {
return this.stockQuery.items$;
}
public updateRefreashRate(refreshRate: number) {
this.refreshRate = refreshRate;
this.notifyStockFetching$.next();
}
public requestNewStock(stocks: string[]) {
this.stocks = stocks;
this.updateStateArr = new Set();
this.stockStore.clearStocks();
this.notifyStockFetching$.next();
}
private handleStockFetchingData(): Observable<any> {
return from(this.stocks).pipe(
mergeMap(stock => {
return this.requestPollService.requestStock(stock).pipe(
tap(res => {
if (res) {
const updateState = this.updateStateArr.has(res.stockCode);
if (!updateState) {
this.updateStateArr.add(res.stockCode);
this.stockStore.addNewStockItem(res); // we update the stock as this stock we just got
} else {
this.stockStore.updateStock(res.stockCode, res);
}
}
})
);
}, 3),
catchError(err => {
console.log(err);
return of([])
})
);
}
}
из compount stock-list.component.ts в init я использую это
import { takeUntil } from "rxjs/operators";
import { Subject } from "rxjs";
import { Component, OnInit, OnDestroy, ChangeDetectorRef } from "@angular/core";
import { Stock } from "../../models/stock.model";
import { SelectItem } from "primeng/api";
import { StockService } from "../../services/stock.service";
@Component({
selector: "app-stock-list",
templateUrl: "./stock-list.component.html",
styleUrls: ["./stock-list.component.scss"]
})
export class StockListComponent implements OnInit, OnDestroy {
subject: Subject<null> = new Subject();
values: Stock[] = [];
origValues: Stock[] = [];
selectedItem: Stock;
sortOptions: SelectItem[];
sortKey: string;
sortField: string;
sortOrder: number;
displayDialog: boolean;
constructor(
private stockService: StockService,
private changeDetection: ChangeDetectorRef
) {}
ngOnDestroy(): void {
this.subject.next();
this.subject.complete();
}
ngOnInit() {
// this.mockData();
this.stockService.handleStocks().subscribe(
() => {},
error => console.error(error)
);
this.stockService.getStocks().subscribe(
stocks => {
this.values = stocks;
this.origValues = stocks;
},
error => console.error(error)
);
this.sortOptions = [
{ label: "Desc high Rate", value: "!high" },
{ label: "Asc high Rate", value: "high" },
{ label: "Desc low Rate", value: "!low" },
{ label: "Asc low Rate", value: "low" },
{ label: "Desc volume Rate", value: "!volume" },
{ label: "Asc volume Rate", value: "volume" }
];
}
onDialogHide() {
this.selectedItem = null;
}
mockData() {
for (let i = 1; i <= 40; i++) {
const randSeed = Math.floor(Math.random() * 100) + 1;
const randSeedChange = Number(
(Math.floor(Math.random() * 10) + 1).toFixed(2)
);
const objSeed: Stock = {
change: randSeedChange,
changePresent: `${randSeedChange}%`,
high: Number((randSeed * 2.4).toFixed(2)),
low: Number((randSeed * 1.4).toFixed(2)),
open: Number((randSeed * 1.8).toFixed(2)),
stockCode: "APP",
volume: randSeed * 8,
lastUpdate: "12.2.2020"
};
this.values = [...this.values, objSeed];
}
this.origValues = [...this.values];
}
onSearch($event) {
const arr = [];
const value = $event.target.value;
if (value === "") {
this.values = this.origValues.slice();
} else {
this.values = this.origValues.filter(item =>
item.volume.toString().includes(value)
);
}
this.changeDetection.detectChanges();
}
moreInfo($event, item: Stock) {
this.selectedItem = item;
this.displayDialog = true;
$event.preventDefault();
}
goDeepInfo($event) {}
removeItem($event, item: Stock) {}
onSortChange($event) {
const value = $event.value;
if (value.indexOf("!") === 0) {
this.sortOrder = -1;
this.sortField = value.substring(1, value.length);
} else {
this.sortOrder = 1;
this.sortField = value;
}
}
}
как я уже сказал, в конце концов, подписка произошла, но я получил данные впервые, а затем это d ie Мне нужна помощь, я не понимаю, почему.
хорошо, я немного обновляюсь, код все еще остается, что случилось, что он работает правильно, как только я вижу, что данные извлекаются и показываются, я вижу, что происходит таймер (означает, что это l oop), но кажется, что ничего не произошло после того, как я посмотрел на меня, я думаю, что это что-то актуально где-то здесь, просто не знаю, что или почему, между прочим, без ошибок, что так всегда и убрать, не для того, чтобы просто взять на себя.
это то, что я видел, случилось тогда это не получить, где выглядят как
private handleStockFetchingData(): Observable<any> {
return from(this.stocks).pipe(
mergeMap(stock => {
return this.requestPollService.requestStock(stock).pipe(
tap(res => {
if (res) {
const updateState = this.updateStateArr.has(res.stockCode);
if (!updateState) {
this.updateStateArr.add(res.stockCode);
this.stockStore.addNewStockItem(res); // we update the stock as this stock we just got
} else {
this.stockStore.updateStock(res.stockCode, res);
}
}
})
);
}, 3),
catchError(err => {
console.log(err);
return of([])
})
);
}