Tengo problemas de rendimiento en mi aplicación angular2 porque tengo un Observable.combineLatest () grande con muchas entradas que cambian rápidamente y quiero eliminar el rebote de la llamada de devolución de llamada:

myData$ = Observable.combineLatest(
  this.store.let(fromRoot.getFoo),
  this.store.let(fromRoot.getBar),
  this.store.let(fromRoot.getFoobar),
  this.store.let(fromRoot.getBarfoo),
  (foo, bar, foobar, barfoo) => {
     ...
  });

Llamando a debounce después del hecho, p. Ej. Observable.combineLatest (...). DebounceTime (300), es inútil porque la tarea intensiva de la CPU está ocurriendo dentro de la devolución de llamada combineLatest que todavía se llama con frecuencia.

Supongo que tengo que combinar otro Observable pero no estoy seguro de cómo hacerlo, ¿alguna idea?

9
arturh 15 dic. 2016 a las 00:18

2 respuestas

La mejor respuesta

La función project del método combineLatest es esencialmente un operador map. Podrías reorganizar cosas como esta:

myData$ = Observable.combineLatest(
  this.store.let(fromRoot.getFoo),
  this.store.let(fromRoot.getBar),
  this.store.let(fromRoot.getFoobar),
  this.store.let(fromRoot.getBarfoo)
)
.debounceTime(300)
.map(([foo, bar, foobar, barfoo]) => {
  ...
});
9
cartant 14 dic. 2016 a las 22:36

Con rxjs> v6, debe usar la función de tubería rxjs combinada con el operador debounceTime, por ejemplo

import {combineLatest, timer} from 'rxjs';
import {debounceTime} from 'rxjs/operators';

function testCombineLatest() {

  const startTime = Date.now();
  const timerOne$ = timer(1000, 1000);
  const timerTwo$ = timer(1300, 1000);

  combineLatest(timerOne$, timerTwo$)
    .pipe(debounceTime(600))
    .subscribe(([timer1, timer2]) => {
      console.log('TimeElapsed:', Date.now() - startTime);
      console.log('Timer Latest:', timer1, timer2);
    });
}
testCombineLatest();
2
guicey 21 oct. 2019 a las 10:27