RXJS отсутствует дроссель, а оператор? - PullRequest
0 голосов
/ 22 сентября 2019

Удивительно, но в Rxjs нет оператора throttleWhile.

Мой пример использования прост:

HTTP-события, отправленные в процессе загрузки файла.

Я хотел бы ограничить их, если событие имеет тип HttpEventType.UploadProgress и нет, если оно HttpEventType.Response (чтобы поймать окончательное значение, то есть ответ)

Мой сервисный вызов:

this.httpService
  .uploadDocument(file)
  .pipe(
    throttleTime(200) // <-- would luv throttleWhile here
  )
  .subscribe((ev: HttpEvent<any>) => {
    if (ev.type === HttpEventType.UploadProgress) {
      const percentDone = Math.round(100 * ev.loaded / ev.total);
      console.log(percentDone);
      this.progress = percentDone;
    } else if (ev.type === HttpEventType.Response) {
      console.log(ev);
    }
  })

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Я предлагаю вам перейти к следующему решению:

import {throttleTime, partition, take}  from 'rxjs/operators';
import  {timer} from 'rxjs';

let a$ = timer(0, 120).pipe(take(10));
let hasRequiredType = v => v === 9;
let [done$, load$] = partition(hasRequiredType)(a$);
load$.pipe(throttleTime(300)).subscribe(v => console.log("loading", v));
done$.subscribe(v => console.log("done", v));

https://stackblitz.com/edit/typescript-hzu3sp

0 голосов
/ 24 сентября 2019

Есть только дроссель и время дросселя

Так что учтите ваши потребности, я думаю, вы можете пойти на throttleTime

// RxJS v6+
import { interval } from 'rxjs';
import { throttleTime } from 'rxjs/operators';

//emit value every 1 second
const source = interval(1000);
/*
  throttle for five seconds
  last value emitted before throttle ends will be emitted from source
*/
const example = source.pipe(throttleTime(5000));
//output: 0...6...12
const subscribe = example.subscribe(val => console.log(val));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...