триггер проблемы происходит один раз, но затем d ie на предмете (rx js) - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть проблема с темой, что когда я запускаю его один раз, он работает просто замечательно, но когда я изменяю его так, как он, d ie где-то

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

код на моем gitHub

  1. это сервис, который я использую при вызове метода 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([])
      })
    );
  }

1 Ответ

0 голосов
/ 21 февраля 2020

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

...