Asyn c и ожидайте на ReplaySubject - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать метод получения удобства для текущего значения ReplaySubject. Я решил использовать метод .toPromise и использовать синтаксис asyn c await для этого. Примерно так:

get latestResults(): number[] {
  return (async () => {
    return await this._result$.pipe(take(1)).toPromise();
  })();
}

Однако я получаю сообщения о том, что await фактически не заботится об обещании:

Типу "Promise" не хватает следующих свойств из типа 'number []': длина, поп, пу sh, конкат, и еще 25.

Также пробовал:

async getLatestResults(): number[] {
  return await this._result$.pipe(take(1)).toPromise();
}

и стек блицкриг . Предполагается, что в разделе «Кэшированные результаты» используется логика c.

1 Ответ

0 голосов
/ 11 марта 2020

Не используйте toPromise () и asyn c / await. Вместо этого всегда возвращайте Observable.

@Injectable({ providedIn: 'root' })
export class TestState  {

  private readonly _result$ = new ReplaySubject<number[]>(1);

  get results(): Observable<number[]> {
    return this._result$.asObservable();
  }

  updateResults(newResults: number[]): void {
    this._result$.next(newResults);
  }

  getLatestResults(): Observable<number[]> {
    return await this.results.pipe(take(1));
  }
}

Не подписывайтесь на этом Фасаде, не реализуйте OnDestroy на этом Фасаде, вы должны выполнять такое поведение внутри компонента. У вас должна быть только одна наблюдаемая, и эти кэшированные данные будут перетекать в один поток, который вы печатаете в html через асин c канал.

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  value: number;
  result$: Observable<number[]>;
  subject: Subject<void> = new Subject();

  constructor(private readonly _test: TestFacade) {
    this.result$ = this._test.pipe(takeUntil(this.subject)).getLatestResults();
  }

  ngOnInit() {}

  ngOnDestroy() {
    this.subject.next();
    this.subject.complete();
  }
}

Пожалуйста, предоставьте больше информации об этом кэшировании на примере из реальной жизни. , У меня никогда не было ситуации, когда мне понадобился бы ReplaySubject. Например, если вы хотите кэшировать http-запросы, для него есть операторы rx js (shareReplay). Если вы хотите кэшировать данные в состоянии, вы можете хранить некоторую информацию validUntil, которая скажет, что данные не нужно перезагружать до некоторой даты.

...